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

问题描述 投票:5回答:9

我知道并理解结果。

例如:

<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>

但我想知道这个逻辑是如何创建的。 任何人都可以详细说明这个逻辑吗? (也许它只是出现在一个天才头?) 还有其他类似的逻辑吗?

c shift divide
9个回答
20
投票

它并没有在天才的头脑中“弹出”。右移二进制数将数字除以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。


4
投票

我认为你对"2"感到困惑:

7 >> 2

并且认为它应该除以2。

这里的"2"意味着将数字(在这种情况下为"7""2"位置向右移位。

将数字"1"bit位置向右移动将具有除以2的效果:

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

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

8 >> 2 = 2    // In binary: (00001000) >> 2 = (00000010)

2
投票

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

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


2
投票

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

从6.5.7节:

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

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

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


2
投票

阐述Aniket Inge's答案:

编号:30710 = 1001100112

如何乘以10在十进制系统中工作

10 * (30710)

= 10 * (3*102 + 7*100)

= 3*102+1 + 7*100+1

= 3*103 + 7*101

= 307010

= 30710 << 1

同样在二进制中乘以2,

2 * (1001100112)

= 2 * (1*28 + 1*25 + 1*24 + 1*21 1*20)

= 1*28+1 + 1*25+1 + 1*24+1 + 1*21+1 1*20+1

= 1*29 + 1*26 + 1*25 + 1*22 + 1*21

= 10011001102

= 1001100112 << 1


1
投票

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

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


1
投票

只是我的两分钱:我没有看到任何提及右移不总是产生与除以2相同的结果这一事实。由于右移向负无穷大和整数除法舍入为零,有些值(如-1 in in分开时,两个补码)将无法正常工作。


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)

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


0
投票

一个简单的方法来看看为什么它的工作原理,是看看熟悉的十进制十进制数字系统,050是五十,向右移动,它变成005,五,相当于将它除以10.同样的事情与转移左,050变为500,五百,相当于乘以10。

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

© www.soinside.com 2019 - 2024. All rights reserved.