什么>>和0xfffffff8是什么意思?

时间:2011-10-10 20:07:48

标签: c bitwise-operators

我被告知(i >> 3) is faster than (i/8),但我找不到有关>>是什么的任何信息。任何人都可以给我一个解释它的链接吗?

同一个人告诉我“int k = i/8,然后k*8更好地完成了(i&0xfffffff8);”,但谷歌再也没有帮助...... {/ p>

感谢您的任何链接!

11 个答案:

答案 0 :(得分:9)

正如here所解释的那样,>>运算符只是i位的按位移位。因此,将i 1位向右移位会导致整数除以2并且移位3位会导致除以2 ^ 3 = 8。

但是现在这种以2的幂划分的优化不应该再真正完成了,因为编译器应该足够聪明,可以自己做。

类似地,与0xFFFFFFF8(1 ... 1000,最后3位0)的按位AND等于将i向下舍入到最接近的8的倍数(如(i/8)*8那样) ,因为它将i的最后3位归零。

答案 1 :(得分:2)

按位向右移位。 i >> 3i整数3个位置向右移动[二进制] - 也就是除以2^3

答案 2 :(得分:2)

int x = i / 8 * 8:

1)i / 8,可以用i>>替换3 - 向右逐位移位到3位数(8 = 2 ^ 3)

2)i& xfffffff8与面具比较 例如,你有:

i = 11111111
k (i/8) would be: 00011111  
x (k * 8) would be: 11111000

因此操作只重置最后3位:

可以简单地重写可比较的时间成本乘法和除法运算

我& xfffffff8 - 与(... 11111000面具)比较

答案 3 :(得分:1)

关于上半场:

>>向右移动了一点点。

因此,将数值向右移3位与除以8和int结果相同。

以下是运营商及其优先级的良好参考:http://web.cs.mun.ca/~michael/c/op.html

问题的第二部分涉及&运算符,这是一个有点明智的AND。示例是ANDing i和一个除了3个最低有效位之外的所有位都设置的数字。当你有一个数字,除以8,将结果存储为整数,然后将结果乘以8时,这基本上是相同的事情。

原因是除以8并存储为整数与向右移位3位相同,乘以8并将结果存储在int中与位移相同左边3个地方。

因此,如果你乘以或除以2的幂,例如8,并且你将接受截断当你将结果存储在int时发生的位,在操作上,换档速度更快。这是因为处理器可以跳过乘法/除法算法,直接转移到位,这需要几步。

答案 4 :(得分:1)

答案 5 :(得分:1)

>>运算符是位移运算符。它取值由值表示,并将它们移动到右侧的一定数量的槽中。

答案 6 :(得分:1)

按位移位。

假设我有一个8位整数,二进制

  

01000000

如果我离开shift(>>运算符)1,结果是

  

00100000

如果我然后右移(<< operator)1,我明显回来穿我开始了

  

01000000

事实证明,因为第一个二进制整数等于

  

0 * 2 ^ 7 + 1 * 2 ^ 6 + 0 * 2 ^ 5 + 0 * 2 ^ 4 + 0 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0

或简单地说是2 ^ 6或64

当我们右移1时,我们得到以下

  

0 * 2 ^ 7 + 0 * 2 ^ 6 + 1 * 2 ^ 5 + 0 * 2 ^ 4 + 0 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0

或只是2 ^ 5或32

这意味着

i >> 1 

相同
i / 2

如果我们再次转移(i >> 2),我们会再次有效地除以2并得到

i / 2 / 2

这是真的

i / 4

不是一个数学证明,但你可以看到以下内容成立

i >> n == i / (2^n)

答案 7 :(得分:0)

>>right shift operation

如果您有一个数字8,以二进制表示为00001000,将位向右移位3个位置将得到00000001,即十进制1.这相当于除以2三次。

除以相同的数字意味着您将右侧的某些位设置为零。如果您应用蒙版,也可以这样做。比方说,0xF8是11111000按位,如果你和它一个数字,它会将它的最后三位设置为零,其他位将保持不变。例如,10& 0xF8将是00001010& 11111000,等于00001000,或十进制8。

当然如果你使用32位变量,你应该有一个适合这个大小的掩码,所以它将所有的位设置为1,除了右边的三位,给你你的数字 - 0xFFffFFf8。 / p>

答案 8 :(得分:0)

您将二进制位移位,例如:

1000 == 8

0100 == 4(>> 1)

0010 == 2(>> 2)

0001 == 1(>> 3)

当你正在使用基础二系统时,你可以利用某些除数(仅整数!)和只是位移。最重要的是,我相信大多数编译器都知道这一点,并会为你做到这一点。

至于第二部分:

(I和0xfffffff8);

说我= 16

0x00000010& 0xfffffff8 == 16

(16/8)* 8 == 16

再次利用二进制上的逻辑运算符。调查逻辑运算符如何更多地处理二进制文件,以便真正清楚地了解位级别的内容(以及如何读取十六进制)。

答案 9 :(得分:0)

这称为位移,它是对位的操作,例如,如果你在二进制基数上有一个数字,让我们说8,它将是1000,所以

x = 1000;
y = x >> 1; //y = 100 = 4
z = x >> 3; //z = 1 

答案 10 :(得分:0)

>>将数字向右移动。考虑二进制数0001000,它以十进制表示法表示8。将它向右移3位将得到0000001,这是十进制表示法中的数字1。因此,您可以看到向右移动每1位实际上是除以2.请注意,运算符会截断结果的浮点部分。 因此i >> n暗示i/2^n。 这可能很快,具体取决于编译器的实现。但它通常发生在寄存器中,因此与传统的分频和乘法相比非常快。

第二部分的答案包含在第一部分中。由于除法也会截断结果的所有浮点部分,因此8除以理论上会将数字3位向右移,从而丢失有关最右边3位的所有信息。现在,当你再次将它乘以8(理论上这意味着向左移3位)时,在将结果向左移3位后,将最右边的3位填充为零。因此,完整的操作可以被视为一个“&”使用0xfffffff8进行操作,这意味着除最41000之外,该数字的所有位都为1。