深入理解C语言中的移位运算
来源:互联网 发布:数据结构与算法 云盘 编辑:程序博客网 时间:2024/06/06 05:21
深入理解C语言中的移位运算
移位运算:
C语言还提供了一组移位运算,以便向左或者向右移动位模式。对于一个位表示为[xn-1,xn-2,…,x0]的操作数x,C表达式x<<k会生成一个值,其位表示为[xn-k-1,xn-k-2,…,x0,0,…,0]。也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。移位量应该是一个0~n-1之间的值。移位运算是从左至右可结合的,所以x<<j<<k等价于(x<<j)<<k。
</k会生成一个值,其位表示为[xn-k-1,xn-k-2,…,x0,0,…,0]。也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。移位量应该是一个0~n-1之间的值。移位运算是从左至右可结合的,所以x<<j<<k等价于(x<<j)<<k。
有一个相应的右移运算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语言标准并没有明确定义应该使用哪种类型的右移。对于无符号数据(也就是以限定词unsigned声明的整型对象),右移必须是逻辑的。而对于有符号数据(默认的声明的整型对象),算术的或者逻辑的右移都可以。不幸的是,这就意味着任何假设一种或者另一种右移形式的代码都潜在着可移植性问题。然而,实际上,几乎所有的编译器/机器组合都对有符号数据使用算术右移,且许多程序员也都假设机器会使用这种右移。
对于如何区分逻辑右移和算术右移,一般说来无符号整型采用逻辑右移;带符号整型采用算术右移。
- 深入理解C语言中的移位运算
- 深入理解C语言中的移位运算
- [深入理解计算机系统]C语言中的位运算、逻辑运算和移位运算
- c语言中的移位运算符
- C中的移位运算
- C中的移位运算
- C语言中的移位
- c语言中的移位
- C语言的移位运算
- C语言移位运算符
- C语言移位运算符
- C语言移位运算符
- C语言移位运算符
- c中的移位运算符
- C/C++中的移位运算
- c中的移位运算法
- C语言中的运算符>>和<<是算术移位而非逻辑移位
- C语言中的移位操作
- Windows Linux代码中杀掉进程
- IOS开发之__bridge,__bridge_transfer和__bridge_retained
- Android.mk文件的解释
- Linux笔记 9 (进程管理)
- Node Connect 及其中间件的理念相当好
- 深入理解C语言中的移位运算
- PHP $_SERVER详解
- android sqilte
- swift 学习(2)get set willSet and didSet
- HTML5 标准终定稿, 能否引领下一波技术热潮?
- 河南科技学院CSDN高校俱乐部——路由器配置+数据恢复+破解开机密码
- 清除沙盒缓存时,如何显示设备的总容量和可用容量
- iOS提交到appstore的新要求
- 恢复数据库