位运算
首先要了解二进制,位运算会将十进制的数值转位二进制的数值,然后进行运算。
按位与(&)
在使用按位与计算的过程中,发现 3 & 5 = 1;
那么我就很纳闷了,为什么 3 & 5 会等于1呢?这中间有联系联系和规则?
在将数字3和5都转位2进制之后,就会发现其中的奥妙。
在二进制当中
3 & 5= 0011 & 0101 = 0001;
0001 转为十进制 等于1;
到这里我想细心的同学已经发现了其中的规则,就是将二进制的每一位进行比较,如果两个数字都等于1的情况下,那么对应的位置就为1,否则等于0;
第一位0 & 0 得 0;
第二位0 & 1 得 0;
第三位1 & 0 得 0;
第四位1 & 1 得 1;
组合起来就是0001;
3: 0 0 1 1;
& & & &
5: 0 1 0 1;
----------------
1: 0 0 0 1;
按位或(|)
按位或运算的过程中,只要其中一个满足1的要求。就可以等于;
例
3 | 5 = 0011 | 0101 = 0111 =7
异或运算符(^)
异或运算过程中,两个位置如果同为1的情况下等于0;其中一位等于1的情况下等于1;
例:
3 ^ 5 = 0011 ^ 0101 = 0110 = 6
左移运算符(<<)
在将十进制数值转位二进制之后,在尾部添加0.
int的占位符石32位,所以如果将0补全的情况下。
1 = 00000000000000000000000000000001
1 << 5 就是将1的右边添加5个0.
左移运算结束后等于00000000000000000000000000100000
这个时候会发现右边增加了5个0 之后,32位的占位符变成了37位。
这个时候,左边开始的5个0将会被丢弃。变成:
00000000000000000000000000100000
右移运算符(>>)
右移运算符就是将,头部加0.右移几位加几个0.而尾部丢弃。
例:
1 >> 5 = 00000000000000000000000000000000 00001
空格后面的数字都会被丢弃,得到最终的结果等于0;
右移无符号(>>>)
与右移运算符号的区别,主要是在负数运算的时候有所不同。
十进制数字-1时在1的二进制取反,然后在+1;
1的二进制是00000000000000000000000000000001
取反之后是11111111111111111111111111111110 + 1 = 11111111111111111111111111111111
所以 -1 >>> 5 = 00000111111111111111111111111111 = 134217727