12

我知道并理解结果。

例如:

<br>
 7 (decimal) = 00000111 (binary) <br>

and 7 >> 2 = 00000001 (binary) <br>
00000001 (binary) is same as 7 / 4 = 1 <br>
So 7 >> 2 = 7 / 4 <br>
<br>

但我想知道这个逻辑是如何创建的。
谁能详细说明这个逻辑?
(也许它只是突然出现在天才的脑海中?)

还有其他类似的逻辑吗?

4

10 回答 10

41

它并没有在天才的脑海中“弹出”。右移二进制数会将一个数除以 2,左移数会将其乘以 2。这是因为102 在二进制中。将一个数字乘以10(无论是二进制、十进制还是十六进制)都会将 a 附加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。

于 2012-11-27T04:01:30.247 回答
7

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

从第 6.5.7 节开始:

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

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

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

于 2012-11-27T04:15:53.070 回答
6

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

7 >> 2

并认为它应该除以 2。

这里的"2"意思是将数字("7"在这种情况下)"2"位位置向右移动。

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

8 >> 1 = 4    // In binary: (00001000) >> 1 = (00000100)

并且将数字"2"位位置向右移动将具有除以 4 的效果:

8 >> 2 = 2    // In binary: (00001000) >> 2 = (00000010)
于 2015-06-21T13:14:15.613 回答
6

详细阐述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

于 2017-12-06T13:17:38.487 回答
3

它在计算机中使用的二进制数字系统中固有。

类似的逻辑是---左移'n'次意味着乘以2 ^ n。

于 2012-11-27T03:59:22.283 回答
3

一个简单的方法来了解它为什么起作用,就是看一下熟悉的十进制数字系统,050 是 50,将它向右移动,它变成 005,5,相当于将它除以 10。与移位相同的事情左边,050变成500,五百,相当于乘以10。

所有其他数字系统都以相同的方式工作。

于 2018-09-16T16:59:29.053 回答
2

他们这样做是因为转移比实际划分更有效。您只是将所有数字向右或向左移动,逻辑上每班乘/除以 2

如果您想知道为什么 7/4 = 1,那是因为结果的其余部分 (3/4) 被截断,因此它是一个整数。

于 2012-11-27T04:01:03.177 回答
2

只是我的两分钱:我没有看到任何提及右移并不总是产生与除以 2 相同的结果这一事实。由于右移向负无穷大和整数除法四舍五入为零,因此某些值(如 -1 in二进制补码)在除法时将无法按预期工作。

于 2016-09-05T17:35:55.057 回答
1

这是因为>><<运算符正在移动二进制数据。

Binary value 1000 is the double  of binary value 0100
Binary value 0010 is the quarter of binary value 1000
于 2020-10-30T10:39:33.700 回答
0

您可以将其称为天才头脑的想法,或者只是对计算机语言的需求。

在我看来,作为设备的计算机永远不会对数字进行除法或乘法运算,而只是具有将位相加或简单地从这里移到那里的逻辑。您可以通过告诉您的计算机将它们相乘、相减来使算法起作用,但是当逻辑达到实际处理时,您的结果将是位移位的结果或只是位相加的结果。

您可以简单地认为,为了得到一个数字除以 4 的结果,计算机实际上将这些位右移到两个位置,并给出结果:

7 in 8-bit binary = 00000111
Shift Right 2 places = 00000001 // (Which is for sure equal to Decimal 1)

Further examples:
//-- We can divide 9 by four by Right Shifting 2 places
9 in 8-bit binary = 00001001
Shift right 2 places: 00000010 // (Which is equal to 9/4 or Decimal 2)

对汇编语言编程有深入了解的人可以用更多的例子来解释它。如果你想知道这一切背后的实际意义,我想你需要学习计算机的位级算术和汇编语言。

于 2012-11-27T04:32:47.820 回答