先看一个代码吧:

int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

这个应该很熟悉吧,是 java 里 HashMap 的计算 hash 值的方法.这里有一个运算符 "^",他其实就是使用补码来运算的.好了,那么我们下面来说说这些吧:

 >原码。
就是当前数字的二进制表现形式,如-1的原码是1000 0001。 >反码
正数的反码就是本身。负数的反码是二进制保留符号位。剩余位取反,比如-1的反码是1111 1110; >补码
正数的反码、补码、原码都是一样的,负数的补码是在其反码的基础上+1,比如-1的补码是1111 1111。 正数的原码、反码、补码都相同。 负数的反码是除符合位为1外,其他位全取反,简单地说,负数求补码,“反码加1“。
这句话是不负责任的,因为原码、反码和补码概念中,存在符号位,总结一下,”取反加1“时符号位怎么办:
1)取反时,符号位不参与取反。
2)加1时,符号位参与加1。
3)特殊补码,即首位为1,其它位全是0。对于这种形式的补码,不要去求它的原码了,求出来也不对,它就表示该类型中的最小负数,比如10000000表示byte类型中的最小负数-128。 已知一个数的补码,求原码的操作分两种情况:
1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码.
2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取 反,然后再整个数加1.
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111. java有7种位运算符:与(&),或(|),异或(^),取反(~),左移(<<),有符号右移(>>),无符号右移(>>>)。
这7种位运算符,运算时,符号位都要参与运算。 具体的规则如下:
& 如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
| 如果相对应位都是0,则结果为0,否则为1 (A | B)得到61,即 0011 1101
^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
〜 按位补运算符翻转操作数的每一位,即0变成1,1变成0。 (〜A)得到-61,即1100 0011
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
>>>按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111 //1.&
int a = 10,b = 6;
/**
* a = 10 > 00000000 00000000 00000000 00001010
* b = 6 > 00000000 00000000 00000000 00000110
* &
* 2 > 00000000 00000000 00000000 00000010
*/
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(b));
System.out.println(a & b); a = -10;
b = -6; /**
* a = -10 > 11111111 11111111 11111111 11110110
* b = -6 > 11111111 11111111 11111111 11111010
* &
* r = -14 > 11111111 11111111 11111111 11110010
*/ //-10
// 原码 10000000 00000000 00000000 00001010
// 反码 11111111 11111111 11111111 11110101
// 补码 11111111 11111111 11111111 11110110 //-6
// 原码 10000000 00000000 00000000 00000110
// 反码 11111111 11111111 11111111 11111001
// 补码 11111111 11111111 11111111 11111010 // -14
// 原码 10000000 0000000 00000000 00001110
// 反码 11111111 1111111 11111111 11110001
// 补码 11111111 1111111 11111111 11110010 System.out.println("a = " + a + ",补码是:" + Integer.toBinaryString(a));
System.out.println("b = " + b + " ,补码是:" + Integer.toBinaryString(b));
System.out.println("a ^ b is:" + (a & b));
System.out.println("结果的补码是:" + Integer.toBinaryString(-14));

java 的原码、补码、反码小总结的更多相关文章

  1. Java基础 - 原码、反码、补码

    目录 机器数 真值 原码 反码 补码 为什么使用原码. 反码. 补码 机器数 所有数字在计算机底层都是以二进制形式存在的.它的表现形式叫做机器数,这个数有正负之分,最高位为符号位.0 表示正数, 1 ...

  2. Java(原码、反码、补码和计算机存储格式)

    原码:将一个整数,转换成二进制,就是其原码.如单字节的5的原码为:0000 0101:-5的原码为1000 0101. 反码:正数的反码就是其原码:负数的反码是将原码中,除符号位以外,每一位取反.如单 ...

  3. C正数负数的原码补码反码以及内存地址分析

    #include<stdio.h> void swap(int a, int b); void main1(){ int i = 10; //正数的原码 00000000 00000000 ...

  4. java 变量及数据类型、原码、反码、补码

    Java基础——变量及数据类型 变量的概念 内存中的一个存储区域 变量名+数据类型 可在同一类型范围内不断变化 为什么定义变量: 用于不断的存放同一类型的常量,并可以重复使用 使用变量注意: 变量的作 ...

  5. Java基础-原码反码补码

    Java基础-原码反码补码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 注意,我们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码. 一.原码 ...

  6. Java:二进制(原码、反码、补码)与位运算

    一.二进制(原码.反码.补码) 二进制的最高位是符号位(“0”代表正数,“1”代表负数): Java中没有无符号数: 计算机以整数的补码进行运算: 1.  原码:将一个整数转换成二进制表示 以 int ...

  7. Java 数字用二进制表示,以及原码,反码,补码、负数的二进制表示

    首先我们要对原码.反码和补码有个了解: 1.所谓原码就是二进制定点表示法,即最高位为符号位,"0"表示正,"1"表示负,其余位表示数值的大小. 2.反码表示法规 ...

  8. (7)java基础知识-原码、反码、补码、运算符

    一.原码.反码.补码 原码 一个数转化成二进制. 用最高位来表示正负,最高位为0表示正数,最高位为1表示负数. 例如: short i=5: 因为在java里short占2个字节转化成二进制就是 00 ...

  9. Java位运算符、位移运算符;原码、反码、补码

    文章背景:雪花算法 id 生成长度问题. Java位运算符 - 异或运算符(^)<p>运算规则:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1.</p> - ...

随机推荐

  1. 128bit 整数运算的实现

    对于128bit的长整型运算,GCC提供了扩展类型:__int128.然而该类型不在C/C++语言的标准之中,并且对于不同种类的编译器,它的实现情况不同.因此,在编写相关的可移植程序时,我们有必要实现 ...

  2. 优化Android Studio/Gradle构建(转)

    参考:http://hm.itheima.com/thread-204217-1-1.html

  3. Vue项目碰到"‘webpack-dev-server’不是内部或外部命令,也不是可运行的程序或批处理文件"报错

    解决办法: 最后将项目里的“node_modules”文件夹删除,然后在cmd中cd到项目目录,依次运行命令:npm install和npm run build,最后运行npm run dev后项目成 ...

  4. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对   描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们 ...

  5. VBA XML信息提取

    Option Explicit Sub 读取XML节点() '后期绑定 'Dim xdoc As Object 'Set xdoc = CreateObject("MSXML2.DOMDoc ...

  6. oracle sql语句大全

    ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约 ...

  7. gooflow学习笔记

    前端jqury脚本实现流程设计,兼容目前主流浏览器 gooflow 默认属性节点只有:id,name,top,left,width,height,type (各个版本不同,属性节点有所增加),但是这些 ...

  8. js 14位字符串 转日期

    const pattern = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; const newDate = new Date(timeEnd.repla ...

  9. 配置GitHub的SSH key

    配置GitHub的SSH key 生成密钥对 打开git bash工具(Windows环境),Linux则直接打开命令行,执行下面的命令生成密钥文件 ssh-Keygen -t rsa -C &quo ...

  10. 解决sqlserver还原数据库失败命令

    1.使用Master数据库 2.选择数据库 select * from master.sys.sysprocesses where dbid=db_id('database') 3.查出进程使用kil ...