Shallow Dream

Keep It Simple and Stupid!

0%

位操作

语言:Java

位(bit)(比特)(Binary Digits):存放一位二进制数,0或者1

字节(B)(Byte):一个字节占8位。

位的基本操作

https://www.runoob.com/w3cnote/bit-operation.html 这篇教程介绍的比较详细了,这里不过多赘述

打印一个整数的32位

1
2
3
4
5
6
7
/*打印一个整数的所有32位*/
public static void print(int num) {
for (int i = 31; i >= 0; i--) {
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}

特殊的,在 Java 中

1
2
>>		带符号位右移
>>> 不带符号位右移
1
2
3
4
5
6
7
8
9
10
int num = -5;
print(num);
print(num >> 2);
print(num >>> 2);

------
Output:
11111111111111111111111111111011
11111111111111111111111111111110
00111111111111111111111111111110

但是如果仅仅是符号位+31位,对于 0 来说就会存在 +0 和 -0 的情况。

+0 = 0000 0000 0000 0000 0000 0000 0000 0000

-0 = 1000 0000 0000 0000 0000 0000 0000 0000

而且对于运算操作就要分两套逻辑进行,这样在运行时就会影响效率,为了避免这种情况,改变了负数的表示

负数 = 正数取反 + 1

0000 0000 0000 0000 0000 0000 0000 0101 (+5)

1111 1111 1111 1111 1111 1111 1111 1010 (~(+5))

1111 1111 1111 1111 1111 1111 1111 1011 (~(+5)+ 1)也就是 -5

其中,0和-2147483648取反加一等于自身,可以自己尝试