亂七八糟。按專業(yè)角度說,為了解決把二進(jìn)制整數(shù)減法(或負(fù)數(shù)運(yùn)算)轉(zhuǎn)換成加法來算的問題(所以你只聽過累加器,而沒有累減器),就發(fā)明了原碼,反碼,補(bǔ)碼。比如一個(gè)-2,假設(shè)它是八位長度的,原碼就是10000010,最高位1表示這是一個(gè)負(fù)數(shù)。反碼是11111101,就是除符號位以外把原碼各位都取反。補(bǔ)碼就是反碼加1,即11111110。正數(shù)2的補(bǔ)碼規(guī)定為自身,即00000010?,F(xiàn)在把兩個(gè)數(shù)的補(bǔ)碼相加,11111110+00000010=100000000。前面我們已假設(shè)是在八位字長的環(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)算,這些都與上面說的三種碼沒有直接關(guān)系,不要弄混了
成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。創(chuàng)新互聯(lián)建站擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營銷思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開源代碼、注重用戶體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺化效果。
按位取反就是每一位都取反,所謂取反就是1變0,0變1
比如樓主說的10
二進(jìn)制表示就是00000000
00000000
00000000
00001010
取反后就是11111111
11111111
11111111
11110101
這在十進(jìn)制中就是-11
而他的二進(jìn)制原碼表示就是-1011
用以下代碼可以實(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)制串取最后的 長度與第一個(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);
具體理論知識如下所示:
先要理解一些概念:
在2進(jìn)制中,負(fù)數(shù)是以它正值的補(bǔ)碼形式表達(dá)
原碼:一個(gè)整數(shù),按照絕對值大小轉(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型儲存32個(gè)二進(jìn)制位,~這個(gè)符號是按位取反,就是求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ù)的絕對值(注意:5按位取反得到的是負(fù)數(shù))
所以轉(zhuǎn)換為int型為:6
即:int型的i=5 取反后的結(jié)果為-6
java中二進(jìn)制的表示:
1、Java中定義兩個(gè)數(shù),然后分別打印出它們的二進(jìn)制表示(例如7和-7):
System.out.println("Java二進(jìn)制7:?"+Integer.toBinaryString(7));
System.out.println("Java二進(jìn)制-7:?"+Integer.toBinaryString(-7));
輸出:
Java二進(jìn)制7: 111
Java二進(jìn)制-7: 11111111111111111111111111111001
7的二進(jìn)制就是111
-7轉(zhuǎn)化二進(jìn)制的過程:
(1)把-7轉(zhuǎn)化成7,二進(jìn)制是 111
(2)Java中對于不滿32位的int二進(jìn)制自動補(bǔ)齊,所以變成了 (29個(gè)0)111
(3)然后取反 ?(29個(gè)1)000
(4)然后加1 (29個(gè)1)001
擴(kuò)展資料:
c語言中二進(jìn)制的轉(zhuǎn)換:
用函數(shù)轉(zhuǎn)換itoa(值,數(shù)組名,進(jìn)制)
#includestdio.h
#includestdlib.h
void?main()
{
char str[8];
int?i=8;
itoa(i,str,2);
printf("%s",str);
}
參考資料:
java二進(jìn)制——百度百科
正數(shù)的反碼是其本身
負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號位不變,其余各個(gè)位取反
以8位為例
11 原碼為 0000 1011
-11 原碼為 1000 1011
-11 反碼為 1111 0100