用以下代碼可以實現(xiàn)你要求的功能:
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設計、成都網(wǎng)站建設與策劃設計,桑珠孜網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設10年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:桑珠孜等地區(qū)。桑珠孜做網(wǎng)站價格咨詢:13518219792
long lang=64509;
String str1=Long.toBinaryString(lang);//將給定的數(shù)轉(zhuǎn)為二進制字串
String str2=Long.toBinaryString(~lang);//將給定的數(shù)取反轉(zhuǎn)為二進制字串
//將取反后的二進制串取最后的 長度與第一個串長度相等 的子串,這是我們需要的二進制串
String str=str2.substring(str2.length()-str1.length());
//將它轉(zhuǎn)換為十進制整數(shù)
int i=Integer.parseInt(str, 2);
System.out.println(i);
具體理論知識如下所示:
先要理解一些概念:
在2進制中,負數(shù)是以它正值的補碼形式表達
原碼:一個整數(shù),按照絕對值大小轉(zhuǎn)換成的二進制數(shù),稱為原碼。
比如 0000 0000 0000 0000 0000 0000 0000 0101是 5的 原碼。
反碼:將二進制數(shù)按位取反,所得的新二進制數(shù)稱為原二進制數(shù)的反碼。
取反操作指:原為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稱為補碼。
也就是說,要得到一個數(shù)的補碼,先得到反碼,然后將反碼加上1,所得數(shù)稱為補碼。
那么,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
轉(zhuǎn)換為十六進制:0xFFFFFFFB。
====================================
明白了上面的就可以理解怎么求 ~i 了
int型儲存32個二進制位,~這個符號是按位取反,就是求i的反碼。
即得到1111 1111 1111 1111 1111 1111 1111 1010
上面這串二進制代表一個負數(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
這個值就是5的按位取反所得到的int整數(shù)的絕對值(注意:5按位取反得到的是負數(shù))
所以轉(zhuǎn)換為int型為:6
即:int型的i=5 取反后的結果為-6
按位取反就是每一位都取反,所謂取反就是1變0,0變1
比如樓主說的10
二進制表示就是00000000
00000000
00000000
00001010
取反后就是11111111
11111111
11111111
11110101
這在十進制中就是-11
而他的二進制原碼表示就是-1011
在2進制中,負數(shù)是以它正值的補碼形式表達
原碼:一個整數(shù),按照絕對值大小轉(zhuǎn)換成的二進制數(shù),稱為原碼。
比如 0000 0000 0000 0000 0000 0000 0000 0101是 5的 原碼。
反碼:將二進制數(shù)按位取反,所得的新二進制數(shù)稱為原二進制數(shù)的反碼。
取反操作指:原為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稱為補碼。
也就是說,要得到一個數(shù)的補碼,先得到反碼,然后將反碼加上1,所得數(shù)稱為補碼。
那么,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
轉(zhuǎn)換為十六進制:0xFFFFFFFB。
====================================
明白了上面的就可以理解怎么求 ~i 了
int型儲存32個二進制位,~這個符號是按位取反,就是求i的反碼。
即得到1111 1111 1111 1111 1111 1111 1111 1010
上面這串二進制代表一個負數(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
這個值就是5的按位取反所得到的int整數(shù)的絕對值(注意:5按位取反得到的是負數(shù))
所以轉(zhuǎn)換為int型為:6
即:int型的i=5 取反后的結果為-6
這個問題涉及到計算機內(nèi)部的編碼。
對于整數(shù),計算機內(nèi)部用最高位表示符號位,0表示為正,1表示為負。
對于負數(shù),為了便于計算,計算機用補碼來表示其值。
已經(jīng)一個數(shù)的補碼,要知道其值分兩種情況:
1:符號位是0,正數(shù),所以后面的二進制位則表示大小,即正數(shù)的原碼=其補碼。如1表示出來則為00000001(我這里用八位來表示,也可以用16位或32位)
2:符號位是1,負數(shù),這時候需要把后面的數(shù)取反再加一(要問為什么?查一下資料吧,可以根據(jù)補碼的特性推出來),所以11111110表示的數(shù)是1111110取反為0000001,再加1,則為0000002。算上符號位,就是-2。
以你的例子來說,
a=0=0000?0000?0000?0000?0000?0000?0000?0000
~a?=?1111?1111?1111?1111?1111?1111?1111?1111
符號位是1,后面的數(shù)取反再+1
1000?0000?0000?0000?0000?0000?0000?0001?=?-1
分享文章:java后兩位取反代碼 Java 取反
鏈接地址:http://m.kartarina.com/article38/hgposp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計、品牌網(wǎng)站建設、App開發(fā)、自適應網(wǎng)站、網(wǎng)站導航、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)