-1

我对按位运算有一些疑问,我们将不胜感激。

1.)

i = 0x000a;
printf( "2: %x %x %x\n", i, i << 1, i << 2 );
i = 0x0010;
printf( "3: %x %x %x\n", i, i >> 1, i >> 2 );

2)

unsigned int i = 1;
printf( "1: %x %x %x\n", i, ~i, ~~i );
printf( "2: %x %x \n", i, ( 0x0100 & ( 1 << 8 ) ) >> 8 );
printf( "3: %x %x \n", i, 0x0100 ^ ( 1 << 8 ) );
printf( "4: %x %x \n", i, 0x0100 | ( 1 << 4 ) );

我有这些问题的答案,但不明白它是如何工作的。任何人都可以逐步解释它们吗?

提前致谢

4

2 回答 2

3

x<<SOME_VALUE将 x SOME_VALUE 次的所有位向左移动。因此0x000a=1010(2),当左移 1 位时将变为10100or 0x0014。将此数字再次向左移动会将其乘以 2 或产生 0x0028。右移(>>)的逻辑类似,这里不再解释。我认为这解释了您在评论中的要求。

~否定整数的所有位,因此所有 0 位都变为 1,反之亦然。或(在 32 位计算机上)~0x0001(1(2))也是如此。双重否定产生输入。fffffffe11111111111111111111111111111110(2)

&是按位“与”运算符并且是二元运算符 - 它需要两个操作数,并且当且仅当两个数字在该位置都有 1 时,结果数字在给定位置将具有 1。

^or xor 是异或运算符,也是二元运算符。在这里,当且仅当其中一个操作数在给定位置有 1 时,您才会有 1 。

最后是'|' 是逻辑或二元运算符,并且在给定位置具有 1 当且仅当它的至少一个操作数在该位置具有 1。

于 2012-12-11T08:18:00.633 回答
1

我可以对您的查询给出的最简单的解释是,

当您将右移运算符应用 n 位时,结果将为 /(2^n),当您将左移运算符应用 n 位时,结果将为 *(2^n)。

例如,

(10 << 1) 将给出结果 20, (10 >> 1) 将给出结果 5

于 2012-12-11T09:50:44.440 回答