C语言中的位移运算

来源:互联网 发布:pic单片机eeprom 编辑:程序博客网 时间:2024/04/29 09:23
C语言提供了一组位移运算,C表达式x<<k会生成一个值,x向左移动k位,丢弃最高的k位,并在右端补k个0,移位运算时从左至右可结合的,所以x<<k<<j等价于(x<<k)<<j。还有一个相应的右移运算x>>k,但它的行为有点微妙,一般而言机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移是在左端不k个0,算术右移是在左端补k个最高有效位的值,逻辑右移和算术右移在对有符号整数数据的位移操作中非常有用,如
操作 值 值 参数x 01100011 10010101 x<<4 00110000 01010000 x>>4(逻辑右移) 00000110 00001001 x>>4(算术右移) 00000110 11111001
唯一的例外就是算术右移[10010101]的情况,因为操作数的最高位是1,填充的值就是1。(简单粗暴点记忆就是最高位符号位为0都填0,最高符号位为1就都填1)C语言标准并没有明确定义应该使用哪种类型的右移。对于无符号数据(unsigned声明),右移必须是逻辑的。而对于有符号数据,算术位移或者逻辑位移都可以,不幸的是这意味着两种都有可能,造成代码的潜在性可移植问题。然而实际上,几乎所有的编译器/机器组合度对有符号数据使用算术右移,且许多程序员也都假设机器会使用算术右移。java对如何右移有明确定义,表达式x>>k表示将x算术右移k个位置,表达式x>>>k表示将x逻辑右移k个位置。另如果x>>k中k是个很大的值时,许多机器会以x实际所占位对k求余,x为w位,实际右移k mod w位,在32位机器上执行int x>>36时,实际移动为int x>>4。
0 0
原创粉丝点击