C语言中的位移运算

C语言提供了一组位移运算,C表达式x<<k会生成一个值,x向左移动k位,丢弃最高的k位,并在右端补k个0,移位运算时从左至右可结合的,所以x<<k<<j等价于(x<<k)<<j。
还有一个相应的右移运算x>>k,但它的行为有点微妙,一般而言机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移是在左端不k个0,算术右移是在左端补k个最高有效位的值,逻辑右移和算术右移在对有符号整数数据的位移操作中非常有用,如
操作
参数x0110001110010101
x<<40011000001010000
x>>4(逻辑右移)0000011000001001
x>>4(算术右移)0000011011111001
唯一的例外就是算术右移[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。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值