任何人都可以解释为什么'>> 2'移位在C代码中意味着'除以4'?

use*_*566 5 c shift divide

我知道并理解结果.
例如7(十进制)= 00000111(二进制)
和7 >> 2 = 00000001(二进制)
00000001(二进制)与7/4 = 1相同
所以7 >> 2 = 7/4

但是我想知道如何这个逻辑被创造出来.
任何人都可以详细说明这个逻辑吗?
(也许它只是出现在一个天才头?)

还有其他类似的逻辑吗?

Ani*_*nge 22

它并没有在天才的头脑中"弹出".右移二进制数将数字除以2,左移数字将乘以2.这是因为10二进制数为2.将数字乘以10(二进制或十进制或十六进制)会将0数字加到数字上(实际上是左移).类似地,除以10(或2)从数字中去除二进制数字(有效地右移).这就是逻辑真正起作用的方式.

bit-twiddlery在计算机世界中有很多这样的(我在一分钟前发明过的一个词).

http://graphics.stanford.edu/~seander/bithacks.html这是给初学者的.

这是我最喜欢的书:http://www.amazon.com/Hackers-Delight-Edition-Henry-Warren/dp/0321842685/ref=dp_ob_image_bk on bit-twiddlery.


Shi*_*pta 7

详细阐述Aniket Inge 的答案:

数量:307 10 = 100110011 2

十进制乘以 10 的运算原理

10 * (307 10 )

= 10 * (3*10 2 + 7*10 0 )

= 3*10 2+1 + 7*10 0+1

= 3*10 3 + 7*10 1

= 3070 10

= 307 10 << 1

同样乘以二进制 2

2 * (100110011 2 )

= 2 * (1*2 8 + 1*2 5 + 1*2 4 + 1*2 1 1*2 0 )

= 1*2 8+1 + 1*2 5+1 + 1*2 4+1 + 1*2 1+1 1*2 0+1

= 1*2 9 + 1*2 6 + 1*2 5 + 1*2 2 + 1*2 1

= 1001100110 2

= 100110011 2 << 1


Die*_*Epp 6

它实际上在 C 标准中是这样定义的。

来自第 6.5.7 节:

E1 >> E2 的结果是 E1 右移 E2 位位置。[...] 结果的值是 E1 / 2 E2商的整数部分

在大多数架构上,x >> 2仅等于x / 4非负数。对于负数,它通常向相反的方向舍入。

编译器一直能够优化x / 4x >> 2. 这种技术被称为“强度降低”,即使是最老的编译器也能做到这一点。所以写x / 4为没有任何好处x >> 2


Kev*_*gan 6

我认为您对以下内容感到困惑"2"

7 >> 2
Run Code Online (Sandbox Code Playgroud)

并认为它应该除以 2。

这里"2"意味着将数字("7"在本例中)"2"位位置向右移动。

"1"向右 移动一个数字位将产生除以 2 的效果:

8 >> 1 = 4    // In binary: (00001000) >> 1 = (00000100)
Run Code Online (Sandbox Code Playgroud)

向右移动一个数字"2"位将产生除以 4 的效果:

8 >> 2 = 2    // In binary: (00001000) >> 2 = (00000010)
Run Code Online (Sandbox Code Playgroud)