我知道并理解结果。
例如:
<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>
但我想知道这个逻辑是如何创建的。 任何人都可以详细说明这个逻辑吗? (也许它只是出现在一个天才头?) 还有其他类似的逻辑吗?
它并没有在天才的头脑中“弹出”。右移二进制数将数字除以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。
我认为你对"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)
它固有的二进制数字系统用于计算机。
类似的逻辑是---左移'n'次意味着乘以2 ^ n。
它实际上是在C标准中定义的。
从6.5.7节:
E1 >> E2的结果是E1右移E2位的位置。 [...]结果的值是E1 / 2E2的商的组成部分
在大多数架构中,对于非负数,x >> 2
仅等于x / 4
。对于负数,它通常反方向。
编译器一直能够将x / 4
优化为x >> 2
。这种技术被称为“强度降低”,即使是最古老的编译器也可以做到这一点。因此将x / 4
写成x >> 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
他们这样做是因为换班比实际分工更有效率。你只是将所有数字向右或向左移动,逻辑上每次移动/除以2
如果你想知道为什么7/4 = 1,那是因为结果的其余部分(3/4)被截断,所以它是一个整数。
只是我的两分钱:我没有看到任何提及右移不总是产生与除以2相同的结果这一事实。由于右移向负无穷大和整数除法舍入为零,有些值(如-1 in in分开时,两个补码)将无法正常工作。
你可以把它称为天才的想法或只是计算机语言的需要。
据我所知,计算机作为一种设备永远不会划分或增加数字,而只是它有一个逻辑,即从这里添加或简单地将位移位到那里。您可以通过告诉计算机将其相乘,减去它们来使算法工作,但是当逻辑达到实际处理时,结果将是位移位或仅添加位的结果。
您可以简单地认为,为了将数字的结果除以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)
对汇编语言编程有深入了解的人可以用更多的例子来解释它。如果你想知道这一切背后的实际意义,我想你需要研究计算机的位级算术和汇编语言。
一个简单的方法来看看为什么它的工作原理,是看看熟悉的十进制十进制数字系统,050是五十,向右移动,它变成005,五,相当于将它除以10.同样的事情与转移左,050变为500,五百,相当于乘以10。
所有其他数字系统的工作方式相同。