按位移动步骤

时间:2012-12-11 08:04:32

标签: c bit-shift

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

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 ) );

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

提前致谢

2 个答案:

答案 0 :(得分:3)

x<<SOME_VALUE将x SOME_VALUE次的所有位移到左侧。因此0x000a=1010(2),当向左移1位时,将变为101000x0014。将此数字再次向左移动将乘以2或产生0x0028。右移(&gt;&gt;)的逻辑是类似的,我不会在这里解释它。我认为这解释了你在评论中要求的内容。

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

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

^或xor是独占或运算符,并且再次是二进制。当且仅当恰好一个的操作数在给定位置具有1时,才会有1个。

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

答案 1 :(得分:1)

我可以为您的查询提供最简单的解释,

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

例如,

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