我对按位操作有一些疑问,我们将不胜感激。
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 ) );
我对这些问题有答案,但不明白它是如何运作的。任何人都可以逐步解释它们吗?
提前致谢
答案 0 :(得分:3)
x<<SOME_VALUE
将x SOME_VALUE次的所有位移到左侧。因此0x000a=1010(2)
,当向左移1位时,将变为10100
或0x0014
。将此数字再次向左移动将乘以2或产生0x0028。右移(&gt;&gt;)的逻辑是类似的,我不会在这里解释它。我认为这解释了你在评论中要求的内容。
~
否定整数的所有位,因此所有0位都变为1,反之亦然。因此~0x0001(1(2))
是fffffffe
或11111111111111111111111111111110(2)
(在32位计算机上)。双重否定产生输入。
&
是按位“和”运算符并且是二元运算符 - 它需要两个操作数,当且仅当两个数字在该位置都有1时,结果数字在给定位置将为1。
^
或xor是独占或运算符,并且再次是二进制。当且仅当恰好一个的操作数在给定位置具有1时,才会有1个。
最后'|'是逻辑的,或者是二元运算符,并且当且仅当其操作数中的至少一个在该位置具有1时,在给定位置具有1。
答案 1 :(得分:1)
我可以为您的查询提供最简单的解释,
当你将右移运算符应用n位时,结果将是/(2 ^ n),和 当你将左移运算符应用n位时,结果将是*(2 ^ n)。
例如,
(10 <1)将给出结果20并且(10> 1)将给出结果5