左移运算符 <<
它能够将一个二进制数的所有位向左移动指定的位数。左移运算符的运算规则如下:
1. 将二进制数左移n位,相当于将数值乘以2的n次方。 例如,将二进制数0b1011左移2位,即为0b101100,相当于将11乘以2的2次方(即4),得到44。
2. 左移运算符不会改变操作数的符号。左移后,右补0。 无论操作数是正数、负数还是零,左移运算符都只进行位级移动,不会改变符号。
3. 左移运算符会对溢出进行截断。
右移运算符 >>
int a = 8;
a >> 3 //a = 1 (8 / 2的3次方)
1、将二进制数右移n位,相当于将数值除以2的n次方
2、对于运算符对正数、负数、零的处理方式不同
对于正数,符号位不变,右移时左补0
对于负数,符号位不变,右移时左补1
对于零,右移运算符操作后结果仍为0
3、右移运算符会溢出进行截断
无符号右移运算符 >>>
1、将二进制数右移n位,相当于将数值除以2的n次方,并将最高位填充为0
2、任意一个数进行无符号右移后一定是非负数
3、右移运算符会溢出进行截断
按位与 &
1、将两个整数的二进制表示按位进行与运算,
只有当相应的二进制位都为1时,结果才为1,否则结果为0
a的二进制:00100000
b的二进制:00011001
按位与之后:00000000
2、应用一下:请使用按位与运算符判断某个数字是否为奇数?
思路:拿着这个数字和1进行按位与,如果结果是1,则表示该数字为奇数。
按位或 |
1、将两个整数的二进制表示按位进行或运算,
只有当相应的二进制位都为0时,结果才为0,否则结果为1
a的二进制:00100000
b的二进制:00011001
按位或之后:00111001
2、请将0这个数字中第4位的二进制位设置为1(按位或的具体应用,将某个二进制位设置为1)
int flag = 0;
flag = flag | (1 << 3);
按位异或 ^
1、将两个整数的二进制表示按位进行异或运算,只有当相应的二进制位不同,结果才为1,否则结果为0
2、自反性 两次按位等于本身
3、可实现简单的加密
按位取反 ~
将整数的二进制表示按位进行取反运算,即0变为1,1变为0
System.out.println(~100); // -101
100的二进制:01100100
取反后:10011011(这是一个补码哦)
将补码转为原码:11100101 (-101)
应用一下:位清除操作(将某个二进制位中指定位清除为0),例如有这样一个二进制:0b01101101,将第4个低位清除为0
int value = 0b01101101;// 待清除数据
int flag = 1 << 3; // 需要清除第4个低位
int result = value & (~flag);// 使用这种方式运算进行位清除