十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
乱七八糟。按专业角度说,为了解决把二进制整数减法(或负数运算)转换成加法来算的问题(所以你只听过累加器,而没有累减器),就发明了原码,反码,补码。比如一个-2,假设它是八位长度的,原码就是10000010,最高位1表示这是一个负数。反码是11111101,就是除符号位以外把原码各位都取反。补码就是反码加1,即11111110。正数2的补码规定为自身,即00000010。现在把两个数的补码相加,11111110+00000010=100000000。前面我们已假设是在八位字长的环境下运算,现在算出了九位,这样就溢出了,即在八位环境下看,第九位的1是不存在的,结果是00000000,即0。这和我们算2-2的结果是一样的,这就实现了把减法转为加法。另外,java还规定了几个运算,把二进制数作与,或,非,异或,移位等运算,这些都与上面说的三种码没有直接关系,不要弄混了
网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了青白江免费建站欢迎大家使用!
=============(正)十进制转二进制
除二将余数倒置
eg: 127 /2
商:63 /2 31 /2 15 /2 7 /2 3 /2 1
余数:1 1 1 1 1 1
1111111
=============(负)十进制转二进制
1、先求负数绝对值的二进制
2、将得到的二进制完全取反+1
eg: -12
1、0000 1100
2、1111 0011 + 1 = 1111 0100
=============(正)十进制转八进制
除八将余数倒置
eg:54 /8 =66
6
6
=============(负)十进制转八进制
1、先将十进制转为二进制
2、再将二进制转为八进制
eg:-32
1、0010 0000
2、1110 0000
3、三位三位转
340
=============十进制转十六进制
1、先将十进制转为二进制
2、将二进制转为十六进制
=============二进制转为十进制
(正)二进制位上的各个数字乘以以2为底数,以自然数为次幂(自然数从0开始)
0110 1011 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 1*2^6 = 107
(负)
1、首先得到负号
2、将该二进制数取反+1
3、将得到的数转为十进制加上负号。
=============二进制转八进制
(1)将二进制三个三个分为一组,分别求出每组二进制的八进制值,将所得到的值依次排开
(2) 1、将二进制转为十进制
2、将十进制转为八进制
============二进制转十六进制
将二进制四个四个分为一组,分别求出每组二进制的十六进制值,将所得到的值依次排开
============八进制转二进制
(1)将八进制各个位上的数单个转为二进制,不足三位的补0
eg:127 001 010 111
(2) 1、将八进制转为十进制
2、再将十进制转为二进制
============八进制转十进制
八进制位上的各个数字乘以以8为底数,以自然数为次幂(自然数从0开始)
543 3*8^0 + 4*8^1 + 5*8^2 = 355
============八进制转十六进制
1、先将八进制转为二进制
2、再将所得的二进制转为十六进制
============十六进制转二进制
将十六进制各个位上的数单个转为二进制,不足四位的补0
eg:127 0001 0010 0111
============十六进制转其他进制
都需要先转为二进制,再转为其他进制
用以下代码可以实现你要求的功能:
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中是使用补码来表示二进制数据的) 再变为原码就行了 负数的原码就是1XXXXX 第一位是符号位 后面是数值位
public class BinaryReverse
{
private static String s = null;
public static void main(String[] args)
{
BinaryReverse br = new BinaryReverse();
Scanner sc = new Scanner(System.in);
byte tempbyte;
System.out.println("请输入要反转的数字:");
s = sc.nextLine();
tempbyte = Byte.valueOf(s);
tempbyte = br.converse(tempbyte); //开始反转
System.out.println("翻反转后十进制: " + tempbyte);
}
public Byte converse(Byte c)
{
String binaryString = null;
StringBuffer needAdd = new StringBuffer();
binaryString = Integer.toBinaryString(Math.abs(c));
System.out.println(binaryString);
if (s.startsWith("-"))
{
if (binaryString.length() 8)
{
needAdd.append("1");
}
}
else
{
if (binaryString.length() 8)
{
needAdd.append("0");
}
}
for (int i = 0; i (7 - binaryString.length()); i++)
{
needAdd.append("0");
}
binaryString = needAdd.append(binaryString).toString();
System.out.println("原数二进制为: " + binaryString);
String reverseString = needAdd.reverse().toString();
System.out.println("反转后二进制为: " + reverseString);
if (s.startsWith("-"))
{
int i = 0;
for (int j =reverseString.length(),y = 0 ; j 1 ; j--,y++)
{
i = (int) (i + Integer.valueOf(reverseString.charAt(j-1)+"")*Math.pow(2,y));
}
if (reverseString.charAt(0) == '1')
{
i = -i;
}
return (byte)i;
}
return Byte.valueOf(reverseString,2);
}
}
不要忘了加分哦
按位取反就是每一位都取反,所谓取反就是1变0,0变1
比如楼主说的10
二进制表示就是00000000
00000000
00000000
00001010
取反后就是11111111
11111111
11111111
11110101
这在十进制中就是-11
而他的二进制原码表示就是-1011