我知道并理解结果。
例如:
<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
(无论是二进制、十进制还是十六进制)都会将 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。
它实际上在 C 标准中是这样定义的。
从第 6.5.7 节开始:
E1 >> E2 的结果是 E1 右移 E2 位位置。[...] 结果的值是 E1 / 2 E2商的整数部分
在大多数架构上,x >> 2
仅等于x / 4
非负数。对于负数,它通常舍入相反的方向。
编译器总是能够优化x / 4
成x >> 2
. 这种技术被称为“强度降低”,即使是最古老的编译器也可以做到这一点。x / 4
所以写as没有任何好处x >> 2
。
我认为您对以下内容感到困惑"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)
详细阐述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
它在计算机中使用的二进制数字系统中固有。
类似的逻辑是---左移'n'次意味着乘以2 ^ n。
一个简单的方法来了解它为什么起作用,就是看一下熟悉的十进制数字系统,050 是 50,将它向右移动,它变成 005,5,相当于将它除以 10。与移位相同的事情左边,050变成500,五百,相当于乘以10。
所有其他数字系统都以相同的方式工作。
他们这样做是因为转移比实际划分更有效。您只是将所有数字向右或向左移动,逻辑上每班乘/除以 2
如果您想知道为什么 7/4 = 1,那是因为结果的其余部分 (3/4) 被截断,因此它是一个整数。
只是我的两分钱:我没有看到任何提及右移并不总是产生与除以 2 相同的结果这一事实。由于右移向负无穷大和整数除法四舍五入为零,因此某些值(如 -1 in二进制补码)在除法时将无法按预期工作。
这是因为>>
和<<
运算符正在移动二进制数据。
Binary value 1000 is the double of binary value 0100
Binary value 0010 is the quarter of binary value 1000
您可以将其称为天才头脑的想法,或者只是对计算机语言的需求。
在我看来,作为设备的计算机永远不会对数字进行除法或乘法运算,而只是具有将位相加或简单地从这里移到那里的逻辑。您可以通过告诉您的计算机将它们相乘、相减来使算法起作用,但是当逻辑达到实际处理时,您的结果将是位移位的结果或只是位相加的结果。
您可以简单地认为,为了得到一个数字除以 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)
对汇编语言编程有深入了解的人可以用更多的例子来解释它。如果你想知道这一切背后的实际意义,我想你需要学习计算机的位级算术和汇编语言。