多年没用过很基础的东西,对这些移位运算符全部忘记干净了,耳旁还响起老师曾经说过,移位运算的效率,比2元运算求值其他神马的都要来得快,才有今天温故.
就拿这个右移无符号运算来说,
package c03;
public class URShift {
public static void main(String[] args) {
int i = -1;
i >>>= 10;
System.out.println(i);
}
}
其结果为:4194303
怎么来的呢?
因为java里的int型是32位的,且负数的存储以补码(符号位保持不变,其他位是存储数的绝对值按位取反加1)方式:故而-1在存储空间的存放为:
其值为2^32-1=4294967255;
故而无符号右移10位:变成如下图所示:
其值为2^22-1=4194303;
对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:
package c03;
public class URShift {
public static void main(String[] args) {
int i = -1, j = 10000;
i >>= 10;
j >>= 10;
System.out.println(i + ", " + j);
}
}
输出为:-1, 9
拿-1为例,因为右移,高位补1,所以-1的右移始终不变.
然后求补码加1;
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
再例,-100带符号右移四位,其值为-7:
原码为:
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
补码为:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
右移四位后:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
保留符号位,按位取反:
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
再加1,即得原码:
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
- 大小: 9.1 KB
- 大小: 9.4 KB
- 大小: 11.8 KB
分享到:
相关推荐
文中主要讲解了负数移位的实现过程。
运行环境:VS2015,没有环境可以把代码复制出来用 支持小数,支持负数运算
小学数学 正负数的运算 PPT学习教案.pptx
javascript中负数的算术右移和逻辑右移都十分的让人迷惑,特别是逻辑右移>>>,你会发现即使一个很小的负数,右移之后,也会得到一个无比巨大的数,这是为什么呢? 原来在逻辑右移中符号位会随着整体一起往右移动,...
我们所用的单片机很有可能是16位或者8位的,这样,编程时所用的一些变量的取值范围会对我们的 运算有所限制.比如说8位的单片机无符号数最大值为255,有符号最大数为127;16位单片机无符号数最大值为65535,有符号数最大值...
实现软件: protues keil C
S7-200SMART PLC中无符号数据转换+比较+运算(子程序可重复调用)
汇编语言采用冒泡法带符号数进行排序,主要是指令的选择,还有就是显示部分的设计,如何正确显示:0,正数,负数。
习题一 一、填空题: 1、为判断溢出,可采用双符号补码,此时正数的符号用()表示,负数的符号用()表示。 2、采用双符号位的方法进行溢出检测时,若运算结果...当运算结果的符号位和最高有效位为()时,需要左规。
在C语言中,当一个无符号数和一个有符号数进行比较运算时,有符号数会被隐含的转换成无符号数,并假设这两个数都是非负数,然后进行比较运算。当把一个有符号数转换成无符号数时,其底层的二进制表示没有改变,仅仅...
C++版本的四则运算事例,支持负数,表达式中可以含有空格,讲解文章:https://www.cnblogs.com/swarmbees/p/9356346.html
c++实现的表达式求值、查错能力强,支持负数、括号运算
初中数学负数加减乘除运算分类练习.doc
初中数学正负数的加减乘除运算练习题集.doc
计算机负数加法运算.pdf
资源包括:源代码+详细设计报告+使用说明。 设计一台嵌入式CISC模型计算机, 输入包含5个整数(有符号数)的数组M,输出所有负数的平方和。
初中数学正负数的加减乘除运算分类练习题之欧阳美创编.pdf
C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。 unsigned int和int进行运算 直接看例子来说明问题...
(1)按照实验要求设计简单ALU,能执行8种操作,分别为: 1)加、减、增1、减1等4种8位算术运算; 2)与、或、非、异或等4种8位逻辑运算。...注意:算术运算的两个操作数要求都是带符号数,即1位符号位和7位数据位。