亂七八糟。按專業(yè)角度說(shuō),為了解決把二進(jìn)制整數(shù)減法(或負(fù)數(shù)運(yùn)算)轉(zhuǎn)換成加法來(lái)算的問題(所以你只聽過累加器,而沒有累減器),就發(fā)明了原碼,反碼,補(bǔ)碼。比如一個(gè)-2,假設(shè)它是八位長(zhǎng)度的,原碼就是10000010,最高位1表示這是一個(gè)負(fù)數(shù)。反碼是11111101,就是除符號(hào)位以外把原碼各位都取反。補(bǔ)碼就是反碼加1,即11111110。正數(shù)2的補(bǔ)碼規(guī)定為自身,即00000010?,F(xiàn)在把兩個(gè)數(shù)的補(bǔ)碼相加,11111110+00000010=100000000。前面我們已假設(shè)是在八位字長(zhǎng)的環(huán)境下運(yùn)算,現(xiàn)在算出了九位,這樣就溢出了,即在八位環(huán)境下看,第九位的1是不存在的,結(jié)果是00000000,即0。這和我們算2-2的結(jié)果是一樣的,這就實(shí)現(xiàn)了把減法轉(zhuǎn)為加法。另外,java還規(guī)定了幾個(gè)運(yùn)算,把二進(jìn)制數(shù)作與,或,非,異或,移位等運(yùn)算,這些都與上面說(shuō)的三種碼沒有直接關(guān)系,不要弄混了
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了青白江免費(fèi)建站歡迎大家使用!
=============(正)十進(jìn)制轉(zhuǎn)二進(jìn)制
除二將余數(shù)倒置
eg: 127 /2
商:63 /2 31 /2 15 /2 7 /2 3 /2 1
余數(shù):1 1 1 1 1 1
1111111
=============(負(fù))十進(jìn)制轉(zhuǎn)二進(jìn)制
1、先求負(fù)數(shù)絕對(duì)值的二進(jìn)制
2、將得到的二進(jìn)制完全取反+1
eg: -12
1、0000 1100
2、1111 0011 + 1 = 1111 0100
=============(正)十進(jìn)制轉(zhuǎn)八進(jìn)制
除八將余數(shù)倒置
eg:54 /8 =66
6
6
=============(負(fù))十進(jìn)制轉(zhuǎn)八進(jìn)制
1、先將十進(jìn)制轉(zhuǎn)為二進(jìn)制
2、再將二進(jìn)制轉(zhuǎn)為八進(jìn)制
eg:-32
1、0010 0000
2、1110 0000
3、三位三位轉(zhuǎn)
340
=============十進(jìn)制轉(zhuǎn)十六進(jìn)制
1、先將十進(jìn)制轉(zhuǎn)為二進(jìn)制
2、將二進(jìn)制轉(zhuǎn)為十六進(jìn)制
=============二進(jìn)制轉(zhuǎn)為十進(jìn)制
(正)二進(jìn)制位上的各個(gè)數(shù)字乘以以2為底數(shù),以自然數(shù)為次冪(自然數(shù)從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
(負(fù))
1、首先得到負(fù)號(hào)
2、將該二進(jìn)制數(shù)取反+1
3、將得到的數(shù)轉(zhuǎn)為十進(jìn)制加上負(fù)號(hào)。
=============二進(jìn)制轉(zhuǎn)八進(jìn)制
(1)將二進(jìn)制三個(gè)三個(gè)分為一組,分別求出每組二進(jìn)制的八進(jìn)制值,將所得到的值依次排開
(2) 1、將二進(jìn)制轉(zhuǎn)為十進(jìn)制
2、將十進(jìn)制轉(zhuǎn)為八進(jìn)制
============二進(jìn)制轉(zhuǎn)十六進(jìn)制
將二進(jìn)制四個(gè)四個(gè)分為一組,分別求出每組二進(jìn)制的十六進(jìn)制值,將所得到的值依次排開
============八進(jìn)制轉(zhuǎn)二進(jìn)制
(1)將八進(jìn)制各個(gè)位上的數(shù)單個(gè)轉(zhuǎn)為二進(jìn)制,不足三位的補(bǔ)0
eg:127 001 010 111
(2) 1、將八進(jìn)制轉(zhuǎn)為十進(jìn)制
2、再將十進(jìn)制轉(zhuǎn)為二進(jìn)制
============八進(jìn)制轉(zhuǎn)十進(jìn)制
八進(jìn)制位上的各個(gè)數(shù)字乘以以8為底數(shù),以自然數(shù)為次冪(自然數(shù)從0開始)
543 3*8^0 + 4*8^1 + 5*8^2 = 355
============八進(jìn)制轉(zhuǎn)十六進(jìn)制
1、先將八進(jìn)制轉(zhuǎn)為二進(jìn)制
2、再將所得的二進(jìn)制轉(zhuǎn)為十六進(jìn)制
============十六進(jìn)制轉(zhuǎn)二進(jìn)制
將十六進(jìn)制各個(gè)位上的數(shù)單個(gè)轉(zhuǎn)為二進(jìn)制,不足四位的補(bǔ)0
eg:127 0001 0010 0111
============十六進(jìn)制轉(zhuǎn)其他進(jìn)制
都需要先轉(zhuǎn)為二進(jìn)制,再轉(zhuǎn)為其他進(jìn)制
用以下代碼可以實(shí)現(xiàn)你要求的功能:
long lang=64509;
String str1=Long.toBinaryString(lang);//將給定的數(shù)轉(zhuǎn)為二進(jìn)制字串
String str2=Long.toBinaryString(~lang);//將給定的數(shù)取反轉(zhuǎn)為二進(jìn)制字串
//將取反后的二進(jìn)制串取最后的 長(zhǎng)度與第一個(gè)串長(zhǎng)度相等 的子串,這是我們需要的二進(jìn)制串
String str=str2.substring(str2.length()-str1.length());
//將它轉(zhuǎn)換為十進(jìn)制整數(shù)
int i=Integer.parseInt(str, 2);
System.out.println(i);
具體理論知識(shí)如下所示:
先要理解一些概念:
在2進(jìn)制中,負(fù)數(shù)是以它正值的補(bǔ)碼形式表達(dá)
原碼:一個(gè)整數(shù),按照絕對(duì)值大小轉(zhuǎn)換成的二進(jìn)制數(shù),稱為原碼。
比如 0000 0000 0000 0000 0000 0000 0000 0101是 5的 原碼。
反碼:將二進(jìn)制數(shù)按位取反,所得的新二進(jìn)制數(shù)稱為原二進(jìn)制數(shù)的反碼。
取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
比如:將5的二進(jìn)制表達(dá)式的每一位取反,得
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 互為反碼。
補(bǔ)碼:反碼加1稱為補(bǔ)碼。
也就是說(shuō),要得到一個(gè)數(shù)的補(bǔ)碼,先得到反碼,然后將反碼加上1,所得數(shù)稱為補(bǔ)碼。
那么,5的補(bǔ)碼為:
1111 1111 1111 1111 1111 1111 1111 1010 + 1 =
1111 1111 1111 1111 1111 1111 1111 1011
所以,-5 在計(jì)算機(jī)中的二進(jìn)制表達(dá)為:
1111 1111 1111 1111 1111 1111 1111 1011
轉(zhuǎn)換為十六進(jìn)制:0xFFFFFFFB。
====================================
明白了上面的就可以理解怎么求 ~i 了
int型儲(chǔ)存32個(gè)二進(jìn)制位,~這個(gè)符號(hào)是按位取反,就是求i的反碼。
即得到1111 1111 1111 1111 1111 1111 1111 1010
上面這串二進(jìn)制代表一個(gè)負(fù)數(shù),將它轉(zhuǎn)換成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
這個(gè)值就是5的按位取反所得到的int整數(shù)的絕對(duì)值(注意:5按位取反得到的是負(fù)數(shù))
所以轉(zhuǎn)換為int型為:6
即:int型的i=5 取反后的結(jié)果為-6
先取得數(shù)的反碼 然后按位取反 此時(shí)得到的是補(bǔ)碼(因?yàn)樵贘AVA中是使用補(bǔ)碼來(lái)表示二進(jìn)制數(shù)據(jù)的) 再變?yōu)樵a就行了 負(fù)數(shù)的原碼就是1XXXXX 第一位是符號(hào)位 后面是數(shù)值位
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("請(qǐng)輸入要反轉(zhuǎn)的數(shù)字:");
s = sc.nextLine();
tempbyte = Byte.valueOf(s);
tempbyte = br.converse(tempbyte); //開始反轉(zhuǎn)
System.out.println("翻反轉(zhuǎn)后十進(jìn)制: " + 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("原數(shù)二進(jìn)制為: " + binaryString);
String reverseString = needAdd.reverse().toString();
System.out.println("反轉(zhuǎn)后二進(jìn)制為: " + 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
比如樓主說(shuō)的10
二進(jìn)制表示就是00000000
00000000
00000000
00001010
取反后就是11111111
11111111
11111111
11110101
這在十進(jìn)制中就是-11
而他的二進(jìn)制原碼表示就是-1011
網(wǎng)頁(yè)標(biāo)題:java代碼二進(jìn)制數(shù)取反 二進(jìn)制取相反數(shù)
網(wǎng)站鏈接:http://chinadenli.net/article14/dodecge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站改版、虛擬主機(jī)、網(wǎng)站策劃、自適應(yīng)網(wǎng)站、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容