亂七八糟。按專業角度說,為了解決把二進制整數減法(或負數運算)轉換成加法來算的問題(所以你只聽過累加器,而沒有累減器),就發明了原碼,反碼,補碼。比如一個-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
網頁標題:java代碼二進制數取反 二進制取相反數
網站鏈接:http://m.kartarina.com/article14/dodecge.html
成都網站建設公司_創新互聯,為您提供服務器托管、網站改版、虛擬主機、網站策劃、自適應網站、全網營銷推廣
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯