用以下代碼可以實(shí)現(xiàn)你要求的功能:
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),桑珠孜網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:桑珠孜等地區(qū)。桑珠孜做網(wǎng)站價(jià)格咨詢:13518219792
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)制串取最后的 長度與第一個(gè)串長度相等 的子串,這是我們需要的二進(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ǔ)碼。
也就是說,要得到一個(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
按位取反就是每一位都取反,所謂取反就是1變0,0變1
比如樓主說的10
二進(jìn)制表示就是00000000
00000000
00000000
00001010
取反后就是11111111
11111111
11111111
11110101
這在十進(jìn)制中就是-11
而他的二進(jìn)制原碼表示就是-1011
在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ǔ)碼。
也就是說,要得到一個(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
這個(gè)問題涉及到計(jì)算機(jī)內(nèi)部的編碼。
對(duì)于整數(shù),計(jì)算機(jī)內(nèi)部用最高位表示符號(hào)位,0表示為正,1表示為負(fù)。
對(duì)于負(fù)數(shù),為了便于計(jì)算,計(jì)算機(jī)用補(bǔ)碼來表示其值。
已經(jīng)一個(gè)數(shù)的補(bǔ)碼,要知道其值分兩種情況:
1:符號(hào)位是0,正數(shù),所以后面的二進(jìn)制位則表示大小,即正數(shù)的原碼=其補(bǔ)碼。如1表示出來則為00000001(我這里用八位來表示,也可以用16位或32位)
2:符號(hào)位是1,負(fù)數(shù),這時(shí)候需要把后面的數(shù)取反再加一(要問為什么?查一下資料吧,可以根據(jù)補(bǔ)碼的特性推出來),所以11111110表示的數(shù)是1111110取反為0000001,再加1,則為0000002。算上符號(hào)位,就是-2。
以你的例子來說,
a=0=0000?0000?0000?0000?0000?0000?0000?0000
~a?=?1111?1111?1111?1111?1111?1111?1111?1111
符號(hào)位是1,后面的數(shù)取反再+1
1000?0000?0000?0000?0000?0000?0000?0001?=?-1