C 什么是>&燃气轮机;0xFFFFF8是什么意思?

C 什么是>&燃气轮机;0xFFFFF8是什么意思?,c,bitwise-operators,C,Bitwise Operators,我被告知(I>>3)比(I/8)快,但我找不到关于>是什么的任何信息。有人能给我指一个解释它的链接吗 同一个人告诉我,“intk=i/8,然后是k*8,通过(i&0xfffffff8);”但谷歌再次没有帮助我 谢谢你的链接 关于上半年: >是稍微向右移动 因此,将数字值向右移动3位与除以8和inting结果相同 以下是运算符及其优先级的良好参考: 问题的第二部分涉及到&操作符,这是一个有点明智且简单的方法。示例是ANDINi和一个数字,该数字保留除3个最低有效位之外的所有位。当你有一个数字,除以

我被告知
(I>>3)比(I/8)
快,但我找不到关于
>
是什么的任何信息。有人能给我指一个解释它的链接吗

同一个人告诉我,“
intk=i/8
,然后是
k*8
,通过
(i&0xfffffff8);
”但谷歌再次没有帮助我


谢谢你的链接

关于上半年:

>
是稍微向右移动

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

以下是运算符及其优先级的良好参考:

问题的第二部分涉及到
&
操作符,这是一个有点明智且简单的方法。示例是ANDIN
i
和一个数字,该数字保留除3个最低有效位之外的所有位。当你有一个数字,除以8,将结果存储为一个整数,然后将结果乘以8,这基本上是相同的

这样做的原因是,除以8并存储为整数与向右3位的位移位相同,乘以8并将结果存储为int与向左3位的位移位相同

因此,如果你用2的幂乘或除,比如8,并且你要接受当你存储结果为
int
时发生的位截断,那么从操作上来说,位移位更快。这是因为处理器可以跳过乘法/除法算法,直接进行移位,只需几步。

按位右移。
i>>3
i
整数向右移动3位[二进制方式]-aka,除以
2^3
is

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

同一数字的除法和乘法意味着将右边的一些位设置为零。如果您应用了遮罩,也可以执行同样的操作。比如说,0xF8是11111000位,如果你把它和一个数字相加,它将把它的最后三位设为零,其他的位保持不变。例如,10和0xF8将是00001010和11111000,等于00001000,或十进制为8

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

正如所解释的,
>
操作符只是
i
的位的按位移位。因此,将
i
1位向右移位将导致整数除以2,而将3位向右移位将导致整数除以2^3=8

但是现在这种二次方除法的优化不应该再进行了,因为编译器应该足够聪明,可以自己进行


类似地,按位AND和
0xFFFFF8
(1…1000,最后3位0)等于将
i
四舍五入到8的最近倍数(如
(i/8)*8
),因为它将使
i
的最后3位归零,它们是
运算符是位移位运算符。它接受由值表示的位,并将它们向右移位一组插槽。

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

1000==8

0100==4(>>1)

0010==2(>>2)

0001==1(>>3)

由于使用的是基数为2的系统,所以可以利用某些除数(仅限整数!)和位移位。除此之外,我相信大多数编译器都知道这一点,并且会为您做这件事

关于第二部分:

(i&0xfffff8)

假设i=16

0x00000010&0xFFFFF8==16

(16/8)*8==16


再次利用二进制上的逻辑运算符。更深入地研究一下逻辑运算符是如何处理二进制的,以便真正清楚地了解位级别上发生了什么(以及如何读取十六进制)。

这就是所谓的位移位,它是对位的操作,例如,如果二进制基上有一个数字,比如说8,它将是1000,所以

x = 1000;
y = x >> 1; //y = 100 = 4
z = x >> 3; //z = 1 
int x=i/8*8:

1) i/8,可替换为i>>3位右移至3位(8=2^3)

2) i&XFFF8与掩码的比较 例如,您有:

i = 11111111
k (i/8) would be: 00011111  
x (k * 8) would be: 11111000
因此,该操作仅重置最后3位: 可比较的时间开销乘法和除法运算可以简单地用

i&xffff8-与(…11111000掩码)的比较

按位移位

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

01000000

如果我左移(>>操作员)1,结果是

00100000

如果我右移(>2
),我们有效地再次除以2,得到

i / 2 / 2
这真的是

i / 4
不完全是一个数学证明,但你可以看到以下是正确的

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

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

第二部分的答案包含在第一部分本身。由于除法也会截断结果的所有浮点部分,因此按
8
除法理论上会将数字
3
位向右移动,从而丢失关于最右边的3的所有信息
i / 4
i >> n == i / (2^n)