为啥二进制数右移一位是除2

在了解为什么二进制整数右移一位等同于除以2之前,我们要先理解二进制数的基本概念。
二进制数系统是一个基数为2的数位系统,每个数位上的值可以是0或1。每个数位(称为比特)代表一个2的幂次,从右向左数,最右边的比特是2的0次方,也就是1。往左的每一位依次代表2的1次方、2的2次方、2的3次方,依此类推。
例如,二进制数 1011 可以按照以下方式转换为十进制数:

  1. 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0
  2. = 8 + 0 + 2 + 1
  3. = 11 (十进制)

当我们在二进制中对整数进行右移一位操作时,实际上是将所有二进制数位向右移动一位,并在最左边补上一个0(如果是逻辑右移)或原来最左边数位的符号位(如果是算术右移)。这种操作等价于去掉了最低位(最右边的数位),也就是丢弃了2的0次方的项。这样每个数位上原来代表的2的幂次都会减少1。因此,整数的每个部分都会变成原来的一半,即除以2。
以二进制数 1011(十进制中的11)为例,如果我们对它进行右移一位操作,得到的是 0101(十进制中的5)。这个过程可以这样理解:

  1. 原始值:1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0
  2. 右移一位: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)这两个数在二进制下的表现:

  1. i是一个原始的二进制数。
  2. (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):

  1. i = 1100
  2. i - 1 = 1011
  3. i & (i-1)= 1100
  4. & 1011
  5. = 1000

从上面的运算可以看出,i & (i - 1)的结果1000,相较于原始的1100,去掉了最后一个1(即最低位的1),而其他位保持不变。
通过这个方式,i & (i - 1)这个操作可以有效的去掉i二进制表示的最右边的1,而且这个操作可以重复使用,每次都会去掉一个1,直到i变成0。这个技巧在编程中经常被用到,特别是在位运算中处理二进制数的相关问题时。