導航:首頁 > 編程語言 > java位與異或

java位與異或

發布時間:2023-01-13 16:56:20

A. java中異或是怎樣算的

概述

i = 14,異或演算法轉換二進制,同則取0異則取1;

解析

異或是一種基於二進制的位運算,用符號XOR或者^表示,其運演算法則是對運算符兩側數的每一個進制位同值則取0,異值則取1.

簡單理解就是不進位加法,如1+1=0,0+0=0,1+0=1.

For example:

3^5 = 6

轉成二進制後就是 0011 ^ 0101 二號位和三號位都是異值取1 末尾兩個1同值取零,所以3^5 = 0110 = 6

而 i = 50 ,j = 60;

所以:

i 的二進制 = 00110010

j 的二進制 = 00111100

同位相同取0,不同取1所以得出來的值為00001110

i = i ^ j;所以i = 00001110 = 14


拓展內容

異或運算符

性質

1、交換律
2、結合律(即(a^b)^c == a^(b^c))
3、對於任何數x,都有x^x=0,x^0=x
4、自反性 A XOR B XOR B = A xor 0 = A

異或運算最常見於多項式除法,不過它最重要的性質還是自反性:A XOR B XOR B = A,即對給定的數A,用同樣的運算因子(B)作兩次異或運算後仍得到A本身。這是一個神奇的性質,利用這個性質,可以獲得許多有趣的應用。 例如,所有的程序教科書都會向初學者指出,要交換兩個變數的值,必須要引入一個中間變數。但如果使用異或,就可以節約一個變數的存儲空間: 設有A,B兩個變數,存儲的值分別為a,b,則以下三行表達式將互換他們的值 表達式 (值) :
A=A XOR B (a XOR b)
B=B XOR A (b XOR a XOR b = a)
A=A XOR B (a XOR b XOR a = b)

#code:

B. 在javaSE中位運算符^(按位異或)的特點是什麼

按位異或概念不是JAVA的,而是計算機原理的,它最早是用於匯編,JAVA的^只是異或運算在JAVA的實現而已(C/C++也是用^表示按位異或的)
個人觀點,按位異或運算的最大特點是可逆的,如
A=B^C,那麼C==A^B,B==A^C
而其它按位的運算如 +-*/|&都是不可逆的

C. java位異或

第一個圖要表達的是&&的意思,&&是邏輯與,兩邊的條件都是TRUE ,則整個表達式為TRUE。但是計算方向是先左後右,如果左邊表部分已經FALSE,那麼右邊部分不用計算,所以後面那一半 x=6的賦值語句就沒執行。但是&是一個位運算符號,表達式裡面都要計算。
第二個圖,異或就是同位變,1和1異或得0。0和0異或得0,1和0異或得1。A的位可能是1001,某個字可能是1110,異或結果就是0111。那他再異或1001 ,得到1110。所以就是加密解密了。

D. JAVA中按位異或是什麼意思 不太理解,請指教,謝謝!

異或運算沒有聽過,不過位與運算就有,它的原理是:先把十進制(或N進制)轉換成二進制,再分別同位進行與運算,比如:
12&5(java中位與運算是用&符號表示的)
即:12
=
11000
&
5
=
01001
--------------------
=
11001
位異或運算或許是把它們進行異或吧。
PS樓下不能這么說,有些演算法還得用到這些位操作,用得妙的還真叫人拍案叫絕

E. java中的位運算符及其用法。

位邏輯運算符有「與」(AND)、「或」(OR)、「異或(XOR)」、「非(NOT)」,分別用「&」、「|」、「^」、「~」表示。

下面的例子說明了位邏輯運算符:

// Demonstrate the bitwise logical operators.

class BitLogic {

public static void main(String args[]) {

String binary[] = {

"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",

"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"

};

int a = 3; // 0 + 2 + 1 or 0011 in binary

int b = 6; // 4 + 2 + 0 or 0110 in binary

int c = a | b;

int d = a & b;

int e = a ^ b;

int f = (~a & b) | (a & ~b);

int g = ~a & 0x0f;

System.out.println(" a = " + binary[a]);

System.out.println(" b = " + binary[b]);

System.out.println(" a|b = " + binary[c]);

System.out.println(" a&b = " + binary[d]);

System.out.println(" a^b = " + binary[e]);

System.out.println("~a&b|a&~b = " + binary[f]);

System.out.println(" ~a = " + binary[g]);

}

}

在本例中,變數a與b對應位的組合代表了二進制數所有的 4 種組合模式:0-0,0-1,1-0,和1-1。「|」運算符和「&」運算符分別對變數a與b各個對應位的運算得到了變數c和變數d的值。對變數e和f的賦值說明了「^」運算符的功能。字元串數組binary代表了0到15對應的二進制的值。在本例中,數組各元素的排列順序顯示了變數對應值的二進制代碼。數組之所以這樣構造是因為變數的值n對應的二進制代碼可以被正確的存儲在數組對應元素binary[n]中。例如變數a的值為3,則它的二進制代碼對應地存儲在數組元素binary[3]中。~a的值與數字0x0f (對應二進制為0000 1111)進行按位與運算的目的是減小~a的值,保證變數g的結果小於16。因此該程序的運行結果可以用數組binary對應的元素來表示。該程序的輸出如下:

a = 0011

b = 0110

a|b = 0111

a&b = 0010

a^b = 0101

~a&b|a&~b = 0101

~a = 1100

左移運算符

左移運算符<<使指定值的所有位都左移規定的次數。它的通用格式如下所示:

value << num

這里,num指定要移位值value移動的位數。也就是,左移運算符<<使指定值的所有位都左移num位。每左移一個位,高階位都被移出(並且丟棄),並用0填充右邊。這意味著當左移的運算數是int類型時,每移動1位它的第31位就要被移出並且丟棄;當左移的運算數是long類型時,每移動1位它的第63位就要被移出並且丟棄。

在對byte和short類型的值進行移位運算時,你必須小心。因為你知道Java在對表達式求值時,將自動把這些類型擴大為 int型,而且,表達式的值也是int型 。對byte和short類型的值進行移位運算的結果是int型,而且如果左移不超過31位,原來對應各位的值也不會丟棄。但是,如果你對一個負的byte或者short類型的值進行移位運算,它被擴大為int型後,它的符號也被擴展。這樣,整數值結果的高位就會被1填充。因此,為了得到正確的結果,你就要舍棄得到結果的高位。這樣做的最簡單辦法是將結果轉換為byte型。下面的程序說明了這一點:

// Left shifting a byte value.

class ByteShift {

public static void main(String args[]) {

byte a = 64, b;

int i;

i = a << 2;

b = (byte) (a << 2);

System.out.println("Original value of a: " + a);

System.out.println("i and b: " + i + " " + b);

}

}

該程序產生的輸出下所示:

Original value of a: 64

i and b: 256 0

因變數a在賦值表達式中,故被擴大為int型,64(0100 0000)被左移兩次生成值256(10000 0000)被賦給變數i。然而,經過左移後,變數b中惟一的1被移出,低位全部成了0,因此b的值也變成了0。

既然每次左移都可以使原來的操作數翻倍,程序員們經常使用這個辦法來進行快速的2的乘法。但是你要小心,如果你將1移進高階位(31或63位),那麼該值將變為負值。下面的程序說明了這一點:

// Left shifting as a quick way to multiply by 2.

class MultByTwo {

public static void main(String args[]) {

int i;

int num = 0xFFFFFFE;

for(i=0; i<4; i++) {

num = num << 1;

System.out.println(num);

}

}

}

該程序的輸出如下所示:

536870908

1073741816

2147483632

-32

初值經過仔細選擇,以便在左移 4 位後,它會產生-32。正如你看到的,當1被移進31位時,數字被解釋為負值。

右移運算符

右移運算符>>使指定值的所有位都右移規定的次數。它的通用格式如下所示:

value >> num

這里,num指定要移位值value移動的位數。也就是,右移運算符>>使指定值的所有位都右移num位。

下面的程序片段將值32右移2次,將結果8賦給變數a:

int a = 32;

a = a >> 2; // a now contains 8

當值中的某些位被「移出」時,這些位的值將丟棄。例如,下面的程序片段將35右移2次,它的2個低位被移出丟棄,也將結果8賦給變數a:

int a = 35;

a = a >> 2; // a still contains 8

用二進製表示該過程可以更清楚地看到程序的運行過程:

00100011 35

>> 2

00001000 8

將值每右移一次,就相當於將該值除以2並且舍棄了余數。你可以利用這個特點將一個整數進行快速的2的除法。當然,你一定要確保你不會將該數原有的任何一位移出。

右移時,被移走的最高位(最左邊的位)由原來最高位的數字補充。例如,如果要移走的值為負數,每一次右移都在左邊補1,如果要移走的值為正數,每一次右移都在左邊補0,這叫做符號位擴展(保留符號位)(sign extension),在進行右移操作時用來保持負數的符號。例如,–8 >> 1 是–4,用二進製表示如下:

11111000 –8

>>1

11111100 –4

一個要注意的有趣問題是,由於符號位擴展(保留符號位)每次都會在高位補1,因此-1右移的結果總是–1。有時你不希望在右移時保留符號。例如,下面的例子將一個byte型的值轉換為用十六進製表示。注意右移後的值與0x0f進行按位與運算,這樣可以舍棄任何的符號位擴展,以便得到的值可以作為定義數組的下標,從而得到對應數組元素代表的十六進制字元。

// Masking sign extension.

class HexByte {

static public void main(String args[]) {

char hex[] = {

'0', '1', '2', '3', '4', '5', '6', '7',

'8', '9', 'a', 'b', 'c', 'd', 'e', 'f''

};

byte b = (byte) 0xf1;

System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);

}

}

該程序的輸出如下:

b = 0xf1

無符號右移

正如上面剛剛看到的,每一次右移,>>運算符總是自動地用它的先前最高位的內容補它的最高位。這樣做保留了原值的符號。但有時這並不是我們想要的。例如,如果你進行移位操作的運算數不是數字值,你就不希望進行符號位擴展(保留符號位)。當你處理像素值或圖形時,這種情況是相當普遍的。在這種情況下,不管運算數的初值是什麼,你希望移位後總是在高位(最左邊)補0。這就是人們所說的無符號移動(unsigned shift)。這時你可以使用Java的無符號右移運算符>>>,它總是在左邊補0。下面的程序段說明了無符號右移運算符>>>。在本例中,變數a被賦值為-1,用二進製表示就是32位全是1。這個值然後被無符號右移24位,當然它忽略了符號位擴展,在它的左邊總是補0。這樣得到的值255被賦給變數a。

int a = -1;

a = a >>> 24;

下面用二進制形式進一步說明該操作:

11111111 11111111 11111111 11111111 int型- 1的二進制代碼

>>> 24 無符號右移24位

00000000 00000000 00000000 11111111 int型255的二進制代碼由於無符號右移運算符>>>只是對32位和64位的值有意義,所以它並不像你想像的那樣有用。因為你要記住,在表達式中過小的值總是被自動擴大為int型。這意味著符號位擴展和移動總是發生在32位而不是8位或16位。這樣,對第7位以0開始的byte型的值進行無符號移動是不可能的,因為在實際移動運算時,是對擴大後的32位值進行操作。下面的例子說明了這一點:

// Unsigned shifting a byte value.

class ByteUShift {

static public void main(String args[]) {

char hex[] = {

'0', '1', '2', '3', '4', '5', '6', '7',

'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'

};

byte b = (byte) 0xf1;

byte c = (byte) (b >> 4);

byte d = (byte) (b >>> 4);

byte e = (byte) ((b & 0xff) >> 4);

System.out.println(" b = 0x"

+ hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);

System.out.println(" b >> 4 = 0x"

+ hex[(c >> 4) & 0x0f] + hex[c & 0x0f]);

System.out.println(" b >>> 4 = 0x"

+ hex[(d >> 4) & 0x0f] + hex[d & 0x0f]);

System.out.println("( b & 0xff) >> 4 = 0x"

+ hex[(e >> 4) & 0x0f] + hex[e & 0x0f]);

}

}

該程序的輸出顯示了無符號右移運算符>>>對byte型值處理時,實際上不是對byte型值直接操作,而是將其擴大到int型後再處理。在本例中變數b被賦為任意的負byte型值。對變數b右移4位後轉換為byte型,將得到的值賦給變數c,因為有符號位擴展,所以該值為0xff。對變數b進行無符號右移4位操作後轉換為byte型,將得到的值賦給變數d,你可能期望該值是0x0f,但實際上它是0xff,因為在移動之前變數b就被擴展為int型,已經有符號擴展位。最後一個表達式將變數b的值通過按位與運算將其變為8位,然後右移4位,然後將得到的值賦給變數e,這次得到了預想的結果0x0f。由於對變數d(它的值已經是0xff)進行按位與運算後的符號位的狀態已經明了,所以注意,對變數d再沒有進行無符號右移運算。

B = 0xf1

b >> 4 = 0xff

b >>> 4 = 0xff

(b & 0xff) >> 4 = 0x0f

位運算符賦值

所有的二進制位運算符都有一種將賦值與位運算組合在一起的簡寫形式。例如,下面兩個語句都是將變數a右移4位後賦給a:

a = a >> 4;

a >>= 4;

同樣,下面兩個語句都是將表達式a OR b運算後的結果賦給a:

a = a | b;

a |= b;

下面的程序定義了幾個int型變數,然後運用位賦值簡寫的形式將運算後的值賦給相應的變數:

class OpBitEquals {

public static void main(String args[]) {

int a = 1;

int b = 2;

int c = 3;

a |= 4;

b >>= 1;

c <<= 1;

a ^= c;

System.out.println("a = " + a);

System.out.println("b = " + b);

System.out.println("c = " + c);

}

}

該程序的輸出如下所示:

a = 3

b = 1

c = 6

F. JAVA按位異或運算問題

首先取反運算符優先順序高於異或運算符
其次int是32位
28=00011100(前面16位不寫了)
8=00001000
-8=11111000
-28=11100100
所以a=28^-8=00011100^11111000=11100100=-28
a=-28^8=11100100^00001000=11101100=-20
是-20,不是20。樓主看清楚了。

G. java中按位異或與邏輯異或的區別

邏輯沒有異或運算。

位異或指:異或運算^,異或運算它都是以二進制數據為基礎進行運算,1^1=00^0=11^0=10^1=1

H. java中的(或運算,異或運算,與運算)解釋下

java中或運算、異或運算、與運算的使用實例和解釋如下:

publicclassTest{publicstaticvoidmain(String[]args){
//1、左移(<<)
//然後左移2位後,低位補0:
////換算成10進制為20System.out.println(5<<2);//運行結果是20
//2、右移(>>)高位補符號位
//然後右移2位,高位補0:
//
System.out.println(5>>2);//運行結果是1
//3、無符號右移(>>>)高位補0
//例如-5換算成二進制後為:0101取反加1為1011
///
/我們分別對5進行右移3位、-5進行右移3位和無符號右移3位:
System.out.println(5>>3);//結果是0
System.out.println(-5>>3);//結果是-1
System.out.println(-5>>>3);//結果是536870911
//4、位與(&)
//位與:第一個操作數的的第n位於第二個操作數的第n位如果都是1,那麼結果的第n為也為1,否則為0
System.out.println(5&3);//結果為1
System.out.println(4&1);//結果為0
//5、位或(|)
//第一個操作數的的第n位於第二個操作數的第n位只要有一個是1,那麼結果的第n為也為1,否則為0
System.out.println(5|3);//結果為7
//6、位異或(^)
//第一個操作數的的第n位於第二個操作數的第n位相反,那麼結果的第n為也為1,否則為0
System.out.println(5^3);//結果為6
//7、位非(~)//操作數的第n位為1,那麼結果的第n位為0,反之。System.out.println(~5);//結果為-6}}
閱讀全文

與java位與異或相關的資料

熱點內容
蘋果如何創建伺服器錯誤 瀏覽:494
軟考初級程序員大題分值 瀏覽:473
js壓縮視頻文件 瀏覽:578
linux如何通過命令創建文件 瀏覽:989
應用加密app還能訪問應用嘛 瀏覽:433
安卓怎麼用支付寶交違章罰款 瀏覽:665
php面向對象的程序設計 瀏覽:504
數據挖掘演算法書籍推薦 瀏覽:894
投訴聯通用什麼app 瀏覽:150
web伺服器變更ip地址 瀏覽:954
java正則表達式驗證郵箱 瀏覽:360
成熟商務男裝下載什麼軟體app 瀏覽:609
加密2h代表長度是多少厘米 瀏覽:23
拍賣程序員 瀏覽:101
電腦的圖片放在哪個文件夾 瀏覽:276
unsignedintjava 瀏覽:217
編譯器下載地址 瀏覽:43
什麼是面對對象編程 瀏覽:708
b站伺服器什麼時候恢復 瀏覽:721
6p相當於安卓機什麼水準 瀏覽:499