二进制操作, ~按位取反, | 或, & 与, ^异或, >倍数

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