一、位运算
位运算:程序中的所有数在计算机中都是以二进制的形式存储的,位运算就是直接对整数在内存中的二进制位进行操作。
二、位运算符的优先级
下面表格中:序号越小优先级越高,结合性是运算符的运算方向。
序号 | 运算符 | 结合性 |
---|---|---|
1 | [ ] . ( ) (方法调用) | 从左向右 |
2 | ! ~ ++ -- +(一元运算) -(一元运算) | 从右向左 |
3 | * / % | 从左向右 |
4 | + - | 从左向右 |
5 | << >> >>> | 从左向右 |
6 | < <= > >= instanceof | 从左向右 |
7 | == != | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | = | 从右向左 |
三、按位与(&)
计算规则:可以把0看出false,把1看出true,只有当都为true时才为true。
即:0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1
1&2=0000 0001 & 0000 0010 =0000 0000 = 0
按位与运算可以判断一个数的奇偶,一个数二进制末位为1则是奇数。也可以做截位操作,根据它的特性,可以将一个数的某些位变为0.
四、按位或(|)
计算规则:可以把0看出false,把1看出true,只要其中一个为true就为true。
即:0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
五、按位异或(^)
计算规则:可以把0看出false,把1看出true,两者相同则为真,两者不同则为假。
即:0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
六、按位取反(~)
按位取反就是将0变为1,1变为0.
例如:~1 = ~0001 = 1000
七、左移右移(<<、>>、>>>)
左右移运算符分为有符号和无符号。>>>是无符号右移运算符,也叫逻辑右移。
左移(<<):将各二进制位向左移指定位,左端移除的位被丢弃,右端空出的位用0补充。
左移一位相当于乘以2,左移n位相当于乘以2n。
右移(>>):将各二进制位向右移指定位, 左端空出的位,当最高位是0(正数),左边补齐0;当最高位是1(负数),左边补齐1。
正数右移一位相当于除以2,然后商取整。
负数右移一位相当于其绝对值除以2,然后商取整加1再乘以-1。例如:-5>>1 = (5/2 + 1) * (-1) = -3
无符号右移(>>>):无论最高位是0还是1,左边都补齐0。
八、移位操作用处
例如求八位的二进制数,看代码:
public String decimalToBinaryByDisplacement(int n) {
String str = "";
for (int i = 7; i >= 0; i--) {
str += n >>> i & 1;
}
return str;
}
上述代码中,通过右移来从高位开始获取其二进制位是0还是1,然后通过按位与来将除了末尾的其他位变为0,此代码中是使用1,当八位二进制中各个位中是1的就是1,否则为0,这样就可以得到二进制的字符串形式。
例如:-2的二进制,for循环第一次时-2 >>> 7结果是0000 0001,再&1得到结果是0000 0001,即数字1,这时str = "1";当for循环第二次时,-2 >>> 6结果是0000 0011,再&1时,0000 0011 & 0000 0001的结果是0000 0001,即数字1,这时str = "11",当最后一位时因为-2最后一位时0,所以整体得到0000 0000,即数字0,这时str = "1111 1110" ,这就是-2的八位二进制表达方式。
网友评论