深入理解C语言中的移位运算
说明:本文主要摘录自《深入理解计算机系统》第二章信息的表示与处理。
移位运算:
C语言还提供了一组移位运算,以便向左或者向右移动位模式。对于一个位表示为[xn-1,xn-2,…,x0]的操作数x,C表达式x<
有一个相应的右移运算x>>k,但是它的行为有点微妙。一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是[0,…,0,xn-1,xn-2,…,xk]。算术右移是在左端补k个最高有效位的值,得到的结果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]。这种做法看上去可能有点奇特,但是我们会发现它对有符号整数数据的运算非常有用。
让我们来看一个例子,下面的表给出了对某些实例8位数据做不同的移位操作得到的结果。
操作
值
参数X
[0110 0011] [1001 0101]
X<<4
[0011 0000] [0101 0000]
X>>4(逻辑右移)
[0000 0110] [0000 1001]
X>>4(算术右移)
[0000 0110] [1111 1001]
斜体的数字表示的是最右端(左移)或最左端(右移)填充的值。可以看到除了一个条目之外,其他的都涉及填充0。唯一的例外是算术右移[10010101]的情况。因为操作数的最高位是1,填充的值就是1。
C