原码、反码、补码与位运算
2019-10-13 11:06:20来源:博客园 阅读 ()
原码、反码、补码与位运算
目录导引:
一、原码、反码、补码
二、位运算
一、原码、反码、补码
计算机只有加法运算器,计算器中存储、计算数据都是补码,正数和0的原码、反码、补码相同,负数的原码、反码、补码不同。
原码:符号位+绝对值(0表示正数,1表示负数)
反码:符号位不变,其余位取反
补码:反码+1
1、为什么要用补码存储,以及补码计算?
因为原码和反码计算会出现+0 和 -0以及计算错误问题,而补码是正确而简单的,符号位也直接参与运算。
示例:
int是4字节,1字节是8位,所以一个int值是32位,第一位是符号位,所以int的取值范围是 -2^31 ~ 2^31-1(10000000 00000000 00000000 00000000~01111111 11111111 11111111 11111111,该二进制是补码)
分别计算 2+(-1)和1+(-1),过程如下:
2的原码、反码、补码分别是 00000000 00000000 00000010,00000000 00000000 00000010,00000000 00000000 00000010
1的原码、反码、补码分别是 00000000 00000000 00000001,00000000 00000000 00000001,00000000 00000000 00000001
-1的原码、反码、补码分别是 10000000 00000000 00000001,11111111 11111111 11111111 11111110,11111111 11111111 11111111 11111111
2和-1原码相加,结果为:10000000 00000000 00000011(原码),0代表正数,1代表负数,所以值为-3,错误。
2和-1反码相加,结果为:00000000 00000000 00000000(反码),对应原码的结果为00000000 00000000 00000000(原码),值为0,错误。
2和-1补码相加,结果为:00000000 00000000 00000001(补码),对应原码的结果为00000000 00000000 00000001(原码),值为1,正确。
1和-1原码相加,结果为:10000000 00000000 00000010(原码),值为-2,错误。
1和-1反码相加,结果为:11111111 11111111 11111111 11111111(反码),对应原码的结果为10000000 00000000 00000000(原码),值为-0,不准确。(关于+0和-0的设计,有兴趣可自行百度)
1和-1补码相加,结果为:00000000 00000000 00000000(补码),对应原码的结果为00000000 00000000 00000000(原码),值为0,正确。
二、位运算
位运算符包括: 与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)、无符号右移(>>>)
&:二进制位同时为1时,结果为1,否则为0
| :位有一个为1时,结果为1,否则为0
~:位0变1,1变0
^:位不同时,结果为1,否则为0
<<:位整体向左移动,右边补0
>>:位整体向右移动,正数左边补0,负数左边补1
>>>:位整体向右移动,左边补0
示例:
public class BitOperationTest {
public static void main(String[] args) {
int a = 13, b = 6;
System.out.println(" a :" + getBinaryStr(a));
System.out.println(" b :" + getBinaryStr(b));
System.out.println(" a&b :" + getBinaryStr(a & b));
System.out.println(" a|b :" + getBinaryStr(a | b));
System.out.println(" ~a :" + getBinaryStr(~a));
System.out.println(" a^b :" + getBinaryStr(a ^ b));
System.out.println(" a<<b :" + getBinaryStr(a << b));
System.out.println(" a>>b :" + getBinaryStr(a >> (b - 4)));
System.out.println(" -a :" + getBinaryStr(-a));
System.out.println(" a>>>b:" + getBinaryStr(a >> (b - 4)));
System.out.println("-a>>>b:" + getBinaryStr((-a) >> (b - 4)));
}
private static String getBinaryStr(int n) {
StringBuilder str = new StringBuilder(Integer.toBinaryString(n));
int len = str.length();
if (len < 32) {
for (int i = 0; i < 32 - len; i++) {
str.insert(0, "0");
}
}
return str.substring(0, 8) + " " + str.substring(8, 16) + " " + str.substring(16, 24) + " " + str.substring(24, 32);
}
}
//Result
a :00000000 00000000 00000000 00001101
b :00000000 00000000 00000000 00000110
a&b :00000000 00000000 00000000 00000100
a|b :00000000 00000000 00000000 00001111
~a :11111111 11111111 11111111 11110010
a^b :00000000 00000000 00000000 00001011
a<<2 :00000000 00000000 00000000 00110100
-a :11111111 11111111 11111111 11110011
a>>2 :00000000 00000000 00000000 00000011
(-a)>>2 :11111111 11111111 11111111 11111100
a>>>2 :00000000 00000000 00000000 00000011
(-a)>>>2:00111111 11111111 11111111 11111100
如有疑问欢迎提出,如有错误欢迎指正。
转载请注明本文地址:https://www.cnblogs.com/yqxx1116/p/11657307.html
原文链接:https://www.cnblogs.com/yqxx1116/p/11657307.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:java-Day01
- 二进制原码、反码、补码以及Java中的<< 和 &a 2020-03-04
- 补码一位乘法 Booth算法 Java简易实现 2019-11-29
- 一文搞明白位运算、补码、反码、原码 2019-08-16
- Java连载14-补码简介&浮点型整数 2019-08-16
- 二进制和位运算 2019-08-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash