java后两位取反代码 Java 取反

Java 取反运算符

用以下代码可以实现你要求的功能:

创新互联是一家专注于成都网站设计、成都网站建设与策划设计,桑珠孜网站建设哪家好?创新互联做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:桑珠孜等地区。桑珠孜做网站价格咨询:13518219792

long lang=64509;

String str1=Long.toBinaryString(lang);//将给定的数转为二进制字串

String str2=Long.toBinaryString(~lang);//将给定的数取反转为二进制字串

//将取反后的二进制串取最后的 长度与第一个串长度相等 的子串,这是我们需要的二进制串

String str=str2.substring(str2.length()-str1.length());

//将它转换为十进制整数

int i=Integer.parseInt(str, 2);

System.out.println(i);

具体理论知识如下所示:

先要理解一些概念:

在2进制中,负数是以它正值的补码形式表达

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 0000 0000 0000 0000 0000 0000 0000 0101是 5的 原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将5的二进制表达式的每一位取反,得

1111 1111 1111 1111 1111 1111 1111 1010

称:1111 1111 1111 1111 1111 1111 1111 1010 是 0000 0000 0000 0000 0000 0000 0000 0101 的反码。

反码是相互的,所以也可称:

1111 1111 1111 1111 1111 1111 1111 1010 和 0000 0000 0000 0000 0000 0000 0000 0101 互为反码。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

那么,5的补码为:

1111 1111 1111 1111 1111 1111 1111 1010 + 1 =

1111 1111 1111 1111 1111 1111 1111 1011

所以,-5 在计算机中的二进制表达为:

1111 1111 1111 1111 1111 1111 1111 1011

转换为十六进制:0xFFFFFFFB。

====================================

明白了上面的就可以理解怎么求 ~i 了

int型储存32个二进制位,~这个符号是按位取反,就是求i的反码。

即得到1111 1111 1111 1111 1111 1111 1111 1010

上面这串二进制代表一个负数,将它转换成int型过程如下:

1111 1111 1111 1111 1111 1111 1111 1010-1 =

1111 1111 1111 1111 1111 1111 1111 1001

再求反:

0000 0000 0000 0000 0000 0000 0000 0110

这个值就是5的按位取反所得到的int整数的绝对值(注意:5按位取反得到的是负数)

所以转换为int型为:6

即:int型的i=5 取反后的结果为-6

java中按位取反运算的详解

按位取反就是每一位都取反,所谓取反就是1变0,0变1

比如楼主说的10

二进制表示就是00000000

00000000

00000000

00001010

取反后就是11111111

11111111

11111111

11110101

这在十进制中就是-11

而他的二进制原码表示就是-1011

关于JAVA 中取反问题

在2进制中,负数是以它正值的补码形式表达

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 0000 0000 0000 0000 0000 0000 0000 0101是 5的 原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将5的二进制表达式的每一位取反,得

1111 1111 1111 1111 1111 1111 1111 1010

称:1111 1111 1111 1111 1111 1111 1111 1010 是 0000 0000 0000 0000 0000 0000 0000 0101 的反码。

反码是相互的,所以也可称:

1111 1111 1111 1111 1111 1111 1111 1010 和 0000 0000 0000 0000 0000 0000 0000 0101 互为反码。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

那么,5的补码为:

1111 1111 1111 1111 1111 1111 1111 1010 + 1 =

1111 1111 1111 1111 1111 1111 1111 1011

所以,-5 在计算机中的二进制表达为:

1111 1111 1111 1111 1111 1111 1111 1011

转换为十六进制:0xFFFFFFFB。

====================================

明白了上面的就可以理解怎么求 ~i 了

int型储存32个二进制位,~这个符号是按位取反,就是求i的反码。

即得到1111 1111 1111 1111 1111 1111 1111 1010

上面这串二进制代表一个负数,将它转换成int型过程如下:

1111 1111 1111 1111 1111 1111 1111 1010-1 =

1111 1111 1111 1111 1111 1111 1111 1001

再求反:

0000 0000 0000 0000 0000 0000 0000 0110

这个值就是5的按位取反所得到的int整数的绝对值(注意:5按位取反得到的是负数)

所以转换为int型为:6

即:int型的i=5 取反后的结果为-6

java编程 按位取反的问题

这个问题涉及到计算机内部的编码。

对于整数,计算机内部用最高位表示符号位,0表示为正,1表示为负。

对于负数,为了便于计算,计算机用补码来表示其值。

已经一个数的补码,要知道其值分两种情况:

1:符号位是0,正数,所以后面的二进制位则表示大小,即正数的原码=其补码。如1表示出来则为00000001(我这里用八位来表示,也可以用16位或32位)

2:符号位是1,负数,这时候需要把后面的数取反再加一(要问为什么?查一下资料吧,可以根据补码的特性推出来),所以11111110表示的数是1111110取反为0000001,再加1,则为0000002。算上符号位,就是-2。

以你的例子来说,

a=0=0000 0000 0000 0000 0000 0000 0000 0000

~a = 1111 1111 1111 1111 1111 1111 1111 1111

符号位是1,后面的数取反再+1

1000 0000 0000 0000 0000 0000 0000 0001 = -1


分享文章:java后两位取反代码 Java 取反
链接URL:http://bzwzjz.com/article/hgposp.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 成都网站制作 成都网站设计 定制网站制作 app网站建设 成都网站设计 手机网站建设套餐 响应式网站设计 成都网站建设 成都网站设计 四川成都网站建设 上市集团网站建设 四川成都网站制作 成都网站设计 成都企业网站设计 温江网站设计 自适应网站建设 成都网站建设 网站制作 成都网站建设 营销网站建设 成都网站制作公司 重庆网站建设