为啥二进制数右移一位是除2
在了解为什么二进制整数右移一位等同于除以2之前,我们要先理解二进制数的基本概念。
二进制数系统是一个基数为2的数位系统,每个数位上的值可以是0或1。每个数位(称为比特)代表一个2的幂次,从右向左数,最右边的比特是2的0次方,也就是1。往左的每一位依次代表2的1次方、2的2次方、2的3次方,依此类推。
例如,二进制数 1011 可以按照以下方式转换为十进制数:
1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0
= 8 + 0 + 2 + 1
= 11 (十进制)
当我们在二进制中对整数进行右移一位操作时,实际上是将所有二进制数位向右移动一位,并在最左边补上一个0(如果是逻辑右移)或原来最左边数位的符号位(如果是算术右移)。这种操作等价于去掉了最低位(最右边的数位),也就是丢弃了2的0次方的项。这样每个数位上原来代表的2的幂次都会减少1。因此,整数的每个部分都会变成原来的一半,即除以2。
以二进制数 1011(十进制中的11)为例,如果我们对它进行右移一位操作,得到的是 0101(十进制中的5)。这个过程可以这样理解:
原始值:1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0
右移一位:0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0
可以看到,每个数位上的值都变成了原来的一半,从而使整个数值除以2。所以,二进制整数右移一位与数值上除以2是等价的操作。
如何理解 二进制 i & (i-1) 可以去掉最后一个1
为了理解二进制操作i & (i - 1)可以去掉i的最后一个1的原理,首先要了解二进制的位运算中的与运算(AND):
在二进制中,与运算的规则是:
- 0 & 0 = 0
- 0 & 1 = 0
- 1 & 0 = 0
- 1 & 1 = 1
也就是说,只有两个对应的位都为1时,结果位才为1。
现在来看i和(i - 1)这两个数在二进制下的表现:
- i是一个原始的二进制数。
- (i - 1)是i减去1之后的数。
考虑i的最低位(最右边的位)是1的情况:
- 如果i的最低位是1,那么从i减去1将会使得最低位变成0,并且不会影响到其他位。因此,i & (i - 1)会将最低位的1变成0,并且保持所有其他位不变。
现在考虑i的最低位是0的情况:
- 如果i的最低位是0,那么i - 1将会使得从最低位开始的一串0变成1,直到遇到的第一个1被变成0。这是因为从i中减去1意味着需要借位,所以会连续翻转直到找到一个可以借的1。
举个实际的例子,假设i是二进制的1100(十进制的12):
i = 1100
i - 1 = 1011
i & (i-1)= 1100
& 1011
= 1000
从上面的运算可以看出,i & (i - 1)的结果1000,相较于原始的1100,去掉了最后一个1(即最低位的1),而其他位保持不变。
通过这个方式,i & (i - 1)这个操作可以有效的去掉i二进制表示的最右边的1,而且这个操作可以重复使用,每次都会去掉一个1,直到i变成0。这个技巧在编程中经常被用到,特别是在位运算中处理二进制数的相关问题时。