我被告知(i >> 3) is faster than (i/8)
,但我找不到有关>>
是什么的任何信息。任何人都可以给我一个解释它的链接吗?
同一个人告诉我“int k = i/8
,然后k*8
更好地完成了(i&0xfffffff8);
”,但谷歌再也没有帮助...... {/ p>
感谢您的任何链接!
答案 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 >> 3
将i
整数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)
如果您有一个数字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
进行操作,这意味着除最4
位1000
之外,该数字的所有位都为1。