常用的位运算
位运算符 | 说明 | 计算 | 案例 |
---|---|---|---|
& | 与 | 都是1为1, 否则即为 0 | 4 & 3 = 0100 & 0011 = 0000 == 0 |
| | 或 | 有一个为1就是1 | 4 & 3 =》 0100 | 0011 = 0111 == 7 |
^ | 异或 | 不同为1 相同为0 | 7 & 3 =》 0111 ^ 0011 = 0100 == 4 |
~ | 取反 | 二进制的0变成1,1变成0 | ~4 = 11111111111111111111111111111011 = -5 |
<< | 左移 | 左移后右边位补 0 | 1<<3 = 8 |
>> | 带符号右移 | 右移后左边位补符号位 | -8>>2 = -2 |
>>> | 不带符号右移 | 右移后左边位补 0 | -8>>>2 = 2 |
正数的原码、反码、补码都是二进制本身;
负数反码就是原码除了符号位不动,其他所有位按位取反
负数的补码是反码加一得到的(运算时包括符号位)
数值 | 原码 | 反码 | 补码 |
---|---|---|---|
+8 | 0000 1000 | 0000 1000 | 0000 1000 |
-8 | 1000 1000 | 1111 0111 | 1111 1000 |
在计算机中,数值都是用补码来计算和存储的。使用补码的原因是:
- 使用补码可以将符号位和数值域统一处理
- 在硬件电路的实现上,只要使用一种加法电路就可以处理各种有符号数的加减计算,使得电路设计简单
打印int类型的位信息
int类型占用4字节一共32位bit, 打印31位到0位的bit位,1左移之后 其他的bit位都是0,如果31位与num等于0 则31位肯定是0
for (int i = 31; i >= 0 ; i--) {
System.out.print( (num & (1<<i)) == 0 ? "0" : "1");
}