一个字节=8位二进制 1k=1024字节 1k=1024*8位二进制
位运算其实就是移位运算,将内存里面的二进制进行移位 比如二进制=101向右移1位 010|1 移位之后的1其实已经不被计算在内了, 变成内存里面的垃圾 在java中,一个int数值类型有32位二进制 1位是符号位,从2的0次方开始算起,数值的范围为 [−232,231−1][-2^{32},2^{31}-1][−232,231−1]
<<
左移就是向左移一位,比如101左移1位
101
1010 向后补0
>>
右移就是向右移一位
101
0101
记住这是带符号位的移位
>>>
和 <<<
则是不带符号位的位运算,比如101
3(10进制的3)=101(二进制的101)
在java中,分配了32位的内存给int,所以在java中的内存应该是这样的:
符号位0标识正数,1标识负数
0 0000 0000 0000 0000 0000 0000 0000 101
无符号左移1位
0 0000 0000 0000 0000 0000 0000 0000 010|1
再拿个负数来举例子−3-3−3
1 0000 0000 0000 0000 0000 0000 0000 101
无符号左移1位
0 1000 0000 0000 0000 0000 0000 0000 010|1
最后负数−3-3−3变成了 230+21=21474836462^{30} + 2^{1}=2147483646230+21=2147483646 便于观察我们可以将-3无符号左移31位
1 0000 0000 0000 0000 0000 0000 0000 101
无符号左移31位
0 0000 0000 0000 0000 0000 0000 0000 001 | 0000 0000 0000 0000 0000 0000 0000 101
就变成了1(10进制)
下面用简单的java程序来证明一下:
public class Random {
public static void main(String[] args) {
int j = -3;
int i = j >>> 31;
System.out.println(i);
}
}
运行上面的程序可以观察到输出1,证明了上面的理论