1.按位与:
两个位都为1时,结果才为1
&1 判断奇偶。
eg1:
xxx&1 === 1,xxx为奇数;xxx&1 ===0,xxx为偶数。
也可以用取模的方式 xxx%2 ===1 奇数, xxx%2 === 0 偶数
1的末位是1,其余是0 ,只有奇数&1才为1。
eg2:
xxx为1, xxx & (xxx-1) === 0
&是只有都为1 才为1,否则为0。所以都是0。
0&-1 2&1 4&3 6&5 =>4 => 所以说偶数 & (偶数-1)不一定为0,奇数 & (奇数-1)也不为0.
2.按位取反:
~[1,2,3].indexOf(1)
判断是否在这个数组中,在数组中。返回-1,-2,-3...。没在数组中返回0。
所有正整数的按位取反是其本身+1的负数
所有负整数的按位取反是其本身+1的绝对值
零的按位取反是 -1
二进制数在内存中是以补码的形式存放的。
另外正数和负数的补码不一样,正数的补码、反码都是其本身,既:
正数9:
原码为: 0000 1001
补码为: 0000 1001
反码为: 0000 1001
再例如: -2
求原码: 1111 0010 (前面4个1表示符号位)
求反码: 1111 1101 (符号位不变,其余各位求反)
求补码: 1111 1110 (符号位不变,末位+1)
所以-2在内存中存放为: 1111 1110
假设要对正数9按位取反——> (~9),计算步骤如下,
原码为 0000 1001,
反码为 0000 1001,
补码为 0000 1001,
对其取反 1111 0110(符号位一起进行取反,这不是反码更加不是最终结果,只是补码的取反仅此而已)
我们还需要把他转换成原码,因为是负数所以进行负数补码到原码的逆运算
先减1得反码: 1111 0101
取反得原码:1111 1010,(反码和原码是一个相对的概念,对反码取反就是原码。取反过程符号位是不变的哦)
前面4个1是符号位,1是负数,既得十进制:-10
3. 按位取 | :
两个位都为0时,结果才为0
小数取整
eg:
5.1 | 0 => 5
5.5 | 0 =>5
5.9 | 0 =>5
4. ~~ 两个连续的按位取反运算,取整:
~~5.1 => 5
~~5.5 =>5
最后一个有趣的事实是:
1. 所有正整数的按位取反是其本身+1的负数
2. 所有负整数的按位取反是其本身+1的绝对值
3. 零的按位取反是 -1(0在数学界既不是正数也不是负数)。
3. 扩大倍数
1>>1 => 0 , 缩小2 = 2^1倍
2>>1 =>1, 缩小2 = 2^1倍
4>>2 =>1, 缩小4= 2^2倍
1<<1 => 2, 扩大2 = 2^1 倍
1<<2 => 4, 扩大4 = 2^2 倍
参考连接:
原文链接:https://blog.csdn.net/xiexievv/java/article/details/8124108