1. 關於java 中取反問題
在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
2. java中按位取反運算的詳解
比如說byte類型的5,在內存中是00000101,按位取反後就是11111010
當你再次輸出這個數時就變成了250
按位取反就是1變0,0變1
3. java取反運算符
運算符的優先順序!高、
但是equals不是運算符、是個方法。
先計算方法的返回值,然後再!取值
4. java中按位取反運算的詳解
按位取反就是每一位都取反,所謂取反就是1變0,0變1
比如樓主說的10
二進製表示就是00000000
00000000
00000000
00001010
取反後就是11111111
11111111
11111111
11110101
這在十進制中就是-11
而他的二進制原碼表示就是-1011
5. java中取反操作是正數取反=正數+1取負 負數取反=負數+1取正,那麼-1取反是等於0嘛
無符號的32bit整型最大值的二進制編碼
和
有符號32bit二補碼編碼整內型的-1的二進制編碼
是一樣的..,就是說容有不少前提。
Java的int是有符號的,只有int被當成無符號的時候,比如轉成long的低32bit,
這時32bit最大值和和int的-1的二進制編碼一樣。
6. Java 取反運算符
用以下代碼可以實現你要求的功能:
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
7. java編程 按位取反的問題
這個問題涉及到計算機內部的編碼。
對於整數,計算機內部用最高位表回示答符號位,0表示為正,1表示為負。
對於負數,為了便於計算,計算機用補碼來表示其值。
已經一個數的補碼,要知道其值分兩種情況:
1:符號位是0,正數,所以後面的二進制位則表示大小,即正數的原碼=其補碼。如1表示出來則為00000001(我這里用八位來表示,也可以用16位或32位)
2:符號位是1,負數,這時候需要把後面的數取反再加一(要問為什麼?查一下資料吧,可以根據補碼的特性推出來),所以11111110表示的數是1111110取反為0000001,再加1,則為0000002。算上符號位,就是-2。
以你的例子來說,
a=0=
~a=
符號位是1,後面的數取反再+1
=-1
8. JAVA中的按位取反什麼意思
按位取反
~ 01101101
10010010
結論:對二進制數按位取反,即0變成1,1變成0。
9. Java中取反是怎麼算的
5:00000101
取反:11111010
因為數在計算機里是用補碼形式存放的...所以要把11111010看做一段補碼
現在把補碼轉化為原版碼,第權一位是符號..不用變..先變成反碼..減1就可以..11111001
再變為原碼10000110,即-6
5&2
5:00000101
2:00000010
與就是各個位做與運算..
1&0=0
0&0=0
1&1=1
結果就是00000000
10. java取反問題
首先,long是64位,抄8位元組
計算機中存儲襲時高位補0,你取反後高位全部為1,所以是負值。
注意0xFFFFFFFF在Java中被認為是整形常量,所以他會被默認為int類型,32位的,在和long類型進行AND操作時,它會按照最高位(此時為1)進行擴展,即它被機器解釋成0xFFFFFFFF FFFFFFFF,這樣以來,你的temp等於沒有變化。
要想改變上面那種情況,你可以這樣寫Ox7FFFFFFF,這時最高位為0,被機器解釋成0x00000000 7FFFFFFF,AND操作會讓temp變成正
不過以上解決方法並不能達到你想要達到的效果,你想要的結果是不是:
只把temp的有效位進行取反,高位不變?