位运算分为2个大类
- 逻辑位运算
- 运算符为:&、|、^、~ 。分别读作:位与、位或、异或、按位取反
- 位移位运算
- 运算符为:<<、>>。分别读作:左移、右移
位于 &(一0则0)
将两个十进制数转为二进制,将此两个二进制转换为列竖式,运算时两个位数任意一个是0则此位是0,有1个1则是1。然后将结果转为十进制。
@Test
void 位于() {
System.out.println("12 转二进制是 :" + Integer.toBinaryString(12));
System.out.println("10 转二进制是 :" + Integer.toBinaryString(10));
System.out.println("12位于10 运算二进制结果是:1000");
System.out.println("二进制的1000 转为十进制是:" + Integer.parseInt("1000", 2));
System.out.println("12&10 -------------》 " + (12 & 10));
}
控制台:
12 转二进制是 :1100
10 转二进制是 :1010
12位于10 运算二进制结果是:1000
二进制的1000 转为十进制是:8
12&10 -------------》 8
位或| (双0则0)
将十进制数转为二进制,将2个二进制的数转换为列竖式,两个位数都是0,则此位是0,否则是1。然后将此结果转为10进制
@Test
void 位或() {
System.out.println("12 转二进制是 :" + Integer.toBinaryString(12));
System.out.println("10 转二进制是 :" + Integer.toBinaryString(10));
System.out.println("12位或10 运算二进制结果是:1110");
System.out.println("二进制的1110 转为十进制是:" + Integer.parseInt("1110", 2));
System.out.println("12|10 -------------》 " + (12 | 10));
}
控制台结果:
12 转二进制是 :1100
10 转二进制是 :1010
12位于10 运算二进制结果是:1110
二进制的1000 转为十进制是:14
12|10 -------------》 14
异或 ^(互异则1)
将十进制数转为二进制,将2个二进制的数转换为列竖式,两个位数不同时,则此位是1,否则是0。然后将此结果转为10进制
@Test
void 异或() {
System.out.println("12 转二进制是 :" + Integer.toBinaryString(12));
System.out.println("10 转二进制是 :" + Integer.toBinaryString(10));
System.out.println("12异或10 运算二进制结果是:0110");
System.out.println("二进制的0110 转为十进制是:" + Integer.parseInt("0110", 2));
System.out.println("12^10 -------------》 " + (12 ^ 10));
}
控制台结果:
12 转二进制是 :1100
10 转二进制是 :1010
12位于10 运算二进制结果是:0110
二进制的0110 转为十进制是:6
12^10 -------------》 6
利用异或可实现一个小面试题,如何不添加变量,实现数据的替换
int a = 123;
int b = 456;
// 操作
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 完成
按位取反 ~
将十进制数转为二进制,将2个二进制的数转换为列竖式,
左移 <<(数值变大)
将十进制数转为二进制,原二进制向左移动X位,空位补0,然后将此结果转为10进制
@Test
void 左移() {
System.out.println("12 转二进制是 :" + Integer.toBinaryString(12));
System.out.println("1100 向左移动3位后 空位补0位 :1100000");
System.out.println("1100000 转为十进制是 :" + Integer.parseInt("1100000", 2));
System.out.println("12 << 3 -------------》 " + (12 << 3));
}
控制台结果:
12 转二进制是 :1100
1100 向左移动3位后 空位补0位 :1100000
1100000 转为十进制是 :96
12 << 3 -------------》 96
右移 >>(数值变小)
将十进制数转为二进制,原二进制向右删除X位,然后将此结果转为10进制
@Test
void 右移() {
System.out.println("12 转二进制是 :" + Integer.toBinaryString(12));
System.out.println("1100 向右移动3位后 :1 (删除3位也就是删除110,只剩下1了。被删除的不补位)");
System.out.println("1 转为十进制是 :" + Integer.parseInt("1", 2));
System.out.println("12 >> 3 -------------》 " + (12 >> 3));
}
控制台结果:
12 转二进制是 :1100
1100 向右移动3位后 :1 (删除3位也就是删除110,只剩下1了。被删除的不补位)
1 转为十进制是 :1
12 >> 3 -------------》 1
利用位运算表示状态
在MySQL我们可以用一个字段表示用户的某个属性或状态,如果用户有大量的状态,就会在数据表创建多个字段。如果不想在数据表创建大量字段,我们可以使用位运算,用一个数字的字段表示用户的状态。(如果未来有新状态,使用位运算也不用创建新字段去表示)
思路:定义一个字段 数字类型 其数字表示了用户的多个状态!
语法如下:
- 检测是否有状态 (oldStatus & someStatus) == someStatus
- 添加状态 oldStatus = oldStatus | newStatus
- 删除状态 oldStatus = oldStatus ^ newStatus
位运算实战 - 多状态标识 - Java代码实现
// 本代码有 查询、添加、删除状态
public class 位运算表示多状态 {
// 定义一些状态
private static int noSex = 1 << 0; // 1 无性别
private static int man = 1 << 1; // 2 男性
private static int woman = 1 << 2; // 4 女性
private static int unName = 1 << 3; // 8 未实名
private static int named = 1 << 4; // 16 已实名
public static void main(String[] args) {
// 定义用户当前状态值
int userStatus = 15;
System.out.println("初始化状态:" + userStatus + " 转为十进制是:" + Integer.toBinaryString(userStatus));
// 打印初始化状态
System.out.println("初始具有状态如下:" + checkAllInfo(userStatus));
// 添加一个已实名状态
userStatus = userStatus | named;
System.out.println("添加'已实名'状态后的结果:" + checkAllInfo(userStatus));
// 删除无性别状态
userStatus = userStatus ^ noSex;
System.out.println("删除'无性别'状态后的结果:" + checkAllInfo(userStatus));
}
public static String checkAllInfo(int userStatus) {
StringBuilder info = new StringBuilder();
if ((userStatus & noSex) == noSex) {
info.append("无性别、");
}
if ((userStatus & man) == man) {
info.append("男性、");
}
if ((userStatus & woman) == woman) {
info.append("女性、");
}
if ((userStatus & unName) == unName) {
info.append("未实名、");
}
if ((userStatus & named) == named) {
info.append("已实名");
}
return info.toString();
}
}
控制台结果
初始化状态:15 转为十进制是:1111
初始具有状态如下:无性别、男性、女性、未实名、
添加'已实名'状态后的结果:无性别、男性、女性、未实名、已实名
删除'无性别'状态后的结果:男性、女性、未实名、已实名
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤