在C/C++中使用左移和右移运算符
时间:2020-02-23 14:30:00 来源:igfitidea点击:
在本文中,我们将研究在C/C++中使用左移和右移运算符。
如果您想进行一些位操作,这两个运算符将非常有用。
使用左移运算符(<<)
左移( <<
)运算符称为算术左移运算符。
这适用于有符号和无符号数字。
因此,我们可以将其应用于int
,long
,char
等类型。
此运算符将数字的位相应左移我们指定的数量。
shifted_value = old_value << amount;
例如,考虑整数100。
按位格式,我们可以将其写为1100100。
但是,我们没有写所有位。
如果我们假设整数是4个字节(32位),则完整的字节表示形式(32位)将是:
00000000000000000000000001100100
如果我们想将此数字左移2个单位,会发生什么?
该数字变为400,即:
00000000000000000000000110010000
这意味着我们将整数乘以(2 ^ amount)!
如果amount = 2
,我们将100乘以2 ^ 2 = 4,那么我们的最终结果是400!
#include <stdio.h> int main() { unsigned int a = 100; unsigned int b = a << 2; //We're NOT type casting to float printf("a = %d, b = %d\n", a, b); return 0; }
输出
a = 100, b = 400
确实,我们能够验证左移是否可以为我们带来这个结果!
现在,让我们看一下正确的移位运算符。
使用右移运算符(>>)
这类似于左移位运算符,但将位向右移位。
其中最后被替换的位不会移到任何地方。
最初的位将替换为0。
shifted_value = old_value >> amount;
这与将" old_value"除以2 ^量相同。
考虑以下代码段:
#include <stdio.h> int main() { unsigned int a = 102; unsigned int b = 205; unsigned int c = a >> 2; unsigned int d = b >> 3; printf("a = %d, c = %d\n", a, c); printf("b = %d, b = %d\n", b, d); return 0; }
输出
a = 102, c = 25 b = 205, b = 25
在第一种情况下,我们得到c = 102 /(2 ^ 2)= 102/4 = 25(最近整数)
您可以通过写入位来验证结果!
102 = 1100100 102 >> 2 = 0011001 (25 -> Notice the leading bits are replaced with 0) 205 = 11001101 205 >> 3 = 00011001 (25)
什么时候应该使用这些运算符?
C标准要求执行算术左移和右移。
但是,这些运算符对带符号数字的行为不是由标准定义的。
这是因为当左移无符号数字时可能会发生溢出错误!
因此,每当您要使用这些运算符时,请注意以下几点:
对于大多数实现,负号的左移通常是不确定的。
除非您需要算术右移,否则最好仅对无符号类型进行位移,因为这样可以避免可能的溢出错误。
因此,我的建议是仅在无符号数据类型上使用它们。