20161123
来源:互联网 发布:ubuntu装回win7 编辑:程序博客网 时间:2024/05/16 14:44
位移运算
1.左移
- 1
- 2
对于一个n位的操作数x,x<<k操作会生成一个值:x向左移动k位,丢弃最高的k位,并在右端补k个0。位移量应该是一个0~n-1之间的值。
位移运算是从左至右可结合的,所以x<<j<<k等价于(x<<j)<<k。
2.右移
- 1
- 2
一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0;算术右移是在左端补k个最高有效位。
3.一个例子
C语言并没有明确定义应该使用哪种类型的右移。
- 对于无符号数据(unsigned声明的整形对象),右移必须是逻辑的;
- 对于有符号数据(默认的声明的整型对象),算术的或者逻辑的右移都可以。然而实际上,几乎所有的编译器/机器组合都对有符号数据使用算术右移,且许多程序员也都假设机器会使用这种右移。
另一方面,Java对于如何进行右移有明确的定义。表达式x>>k会将x算术右移k个位置,而x>>>k会对x做逻辑右移。
位移操作的注意事项
1.位移k位,k很大
问题:对于一个由w位组成的数据类型,如果要移动k(k>>w)位会得到什么结果呢?
例如在一个32位的机器上计算下面的表达式会得到什么结果:
- 1
- 2
- 3
C 语言标准很小心地规避了说明在这种情况下该如何做。在许多机器上,当移动一个w位的值,移位指令只考虑位移量的低
- 1
- 2
- 3
不过这种行为对于C程序来说是没有保障的,所以位移数量应该保持小于字长。
2.与位移有关的操作符优先级问题
- 1
在C语言中,加法(和减法)的优先级比位移运算要高,然后按照从左至右结合性规则,上述表达式应该这样解释:
0 0
- 20161123
- 【Java每日一题】20161123
- [李景山php]每天laravel-20161123|ResetCommand.php
- 每日积累(20161123-day-7)(python安装 ubuntu桌面消失 )
- hadoop核心------>HDFS原理
- homerHEVC代码阅读(32)——帧间预测之merge模式
- 【Python系列6】Navigate for mysql显示Python导入的中文
- Matlab绘图--详细
- 为什么底层人民无法翻身
- 20161123
- c++54
- JavaScript跨域总结与解决办法
- nyoj17_单调递增最长子序列
- 如何用C语言封装 C++的类,在 C里面使用 .
- uva10003 区间DP
- 【Python】SyntaxError: Missing parentheses in call to 'print'
- Linux进程间通信
- 包含容斥原理【题目在挑战程序设计竞赛】