1. java中按位異或是什麼意思 不太理解,請指教,謝謝!
異或運算沒有聽過,不過位與運算就有,它的原理是:先把十進制(或N進制)轉換成二進制,再分別同位進行與運算,比如:
12&5(java中位與運算是用&符號表示的)
即:12
=
11000
&
5
=
01001
--------------------
=
11001
位異或運算或許是把它們進行異或吧。
PS樓下不能這么說,有些演算法還得用到這些位操作,用得妙的還真叫人拍案叫絕
2. java中^是什麼意思
Java中的位運算符!用來做按位異或運算的。異或指的是相同位值相同異或結果為0,相同位異或值不同結果為1。
例如:int
i
=
2^3;
首先需要將數字轉換成二進制數,然後進行運算。2的二進制數是10
3是11
10
11
^
-----------
01
所以,i中的結果是數字1。
3. 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。樓主看清楚了。
4. java運算中&是什麼意思,比如a=1;b=2;a&b=多少
&是位操作符,「按位與」;1轉成二進制 01;2轉成二進制 10;a&b=00轉成十進制為0。
位運算符有:&(按位與)、|(按位或)、^(按位異或)、~ (按位取反)。優先順序從高到低,依次為~、&、^、|。
按位與運算有兩種典型用法,一是取一個位串信息的某幾位,如以下代碼截取x的最低7位:x & 0177。二是讓某變數保留某幾位,其餘位置0,如以下代碼讓x只保留最低6位:x = x & 077。
Java 的表達式就是用運算符連接起來的符合Java 規則的式子,運算符的優先順序決定了表達式中運算執行的先後順序。
(4)java按位異或擴展閱讀:
整數算術運算的異常是由於除零或按零取模造成的。它將引發一個算術異常。下溢產生零,上溢導致越界。例如:加1超過整數最大值,取模後,變成最小值。
一個op=賦值運算符,和上表中的各雙目整數運算符聯用,構成一個表達式。整數關系運算符<,>,<=,>=,==和!=產生boolean類型的數據。
5. JAVA 中的 -> 是什麼意思
本文主要是講解 Java 中的運算符。對於運算符而言是編程參與計算的基礎核心內容。最基礎的加減乘除取余。到後面的邏輯運算大於小於等於不等於。
本文內容思維導圖
先從最簡單的算術運算符說起。
算術運算符
算術運算符又分為: 一元運算符和二元運算符, 並且在 Java 中包含三元運算符, 就是條件運算符或者叫作三目運算符只是名字不同,含義相同。
一元運算符
一元運算符只有一個變數就可以進行操作。常用的一元運算符就是自加,自減。一共四個一元運算符。
示例代碼, 這里使用 JShell 快速查看結果。
需要注意其中的自加和自減的規則。當運算符在前的時候 ++ a; 運算符的優先順序比較高, 所以會先處理這個代碼, 所以可以看到代碼裡面直接返回了結果 4。但是 a ++ 的時候卻沒有直接返回結果, 因為他的運算符比價低。 所以重新調用該變數就會列印出來當前的值。
代碼定義如下:
運行查看結果:
二元運算符
二元運算符一共5個。分辨是加減乘除取余(+、-、*、/、%)。
其中,在進行除法運算的時候,遵守除數不能為 0;
如果除數為 0 就會報錯, 錯誤如下:
代碼示例如下:
運行查看結果,編譯, 運行:
賦值運算符
對於賦值運算符基本上貫穿了整個類的周期。常用的 = 賦值。 和簡寫賦值和算術運算符的使用方式。賦值運算符有如下圖所示的使用方式。
使用 JShell 進行測試代碼如下:
代碼示例如下:
inta=0;
a=3;
System.out.println(a);// 3
a+=3;
System.out.println(a);// 6
a-=3;
System.out.println(a);// 3
a*=3;
System.out.println(a);// 9
a/=3;
System.out.println(a);// 3
a%=2;
System.out.println(a);// 1
比較運算符
比較運算符, 也可以說是布爾運算符。 主要是比較兩個表達式的結果。 (表達式) 操作符 (表達式)
根據上面的運算符進行案例演示, 一定要動手練習。 更能加深印象。
只要知道比較運算是最終得到一個布爾類型的值。並且在進行比較運算的時候, 一定要注意其優先順序。代碼這次自己動手做吧。 有上面的演示, 應該很容易就搞定。
邏輯運算符
對於邏輯運算符, 主要就是 3 個。 邏輯與、邏輯或、邏輯非。和數學中的與或非意思一致。
格式: 表達式1 邏輯運算符 表達式2
邏輯運算符大多數情況下會和其他的運算符一起使用, 主要做一些簡單或復雜的邏輯運算。 並且通常都是和 if, for 等邏輯表達式一起使用。
簡單的說一說, 對於邏輯與和邏輯或不同點。 邏輯與為第一個表達式和第二個表達式都等於真值的情況下才會表達式成立。 邏輯或是第一個表達式為真值的情況下, 就不會在執行第二個表達式。 因為不管第二個表達式是否成立, 該邏輯運算都是真值了。
位運算符
對於任何編程語言而言, 最終的操作都是二進製表示, 因為計算機只認識二進制, 而八進制,十進制或者十六進制都是為了讓開發人員方便開發。對於 Java 來說, 也可以針對數的某個值進行運算。這就需要位運算符的參與了。也是為了方便對二進制進行操作。
位運算符主要有一下運算符:
位與 &
按位與和邏輯運算符的邏輯與很類似,一個比較的表達式, 一個是按照位來進行判斷。在二進制中, 位與的判斷為都為 1 的記做 1 否則記做 0。
按位與規則如下:
0 & 0 = 0;
0 & 1 = 0;
1 & 0 = 0;
1 & 1 = 1;
先看一個都是正整數的值 10 & 2。
最終得出結果 0000 1010 & 0000 0010 = 0000 0010 轉換成十進制就是2。
對於負值的位與運算有點區別的地方就是參與運算的是補碼。
舉例說明: 10 & -2
具體如何得到補碼, 可以參考我之前寫的文章基礎類型的相互轉換。這里對於負值的情況需要了解什麼是原碼,反碼和補碼。參與運算的是補碼。-2 的原碼是 1000 0010 反碼是 1111 1101 補碼 在反碼的基礎最後一位加 1 得到1111 1110。
最終結果得到 0000 1010 & 1111 1110 = 0000 1010 十進制也就是 10。
這個時候怎麼校驗結果是否正確呢? 直接寫 Java 代碼就好了, 打開 jshell:
位或 |
按位或, 和邏輯或很類似, 只要二者有一位 1 結果就是 1。
按位或規則如下:
0 | 0 = 0;
0 | 1 = 1;
1 | 0 = 1;
1 | 1 = 1;
根據上面的運算得到了 10 | 2 = 10。
負值有略有不同。
還是要靈活運用原碼反碼和補碼,特別是負數的情況下, 因為正數的原碼和補碼一致。
位反 ~
按位反, 和邏輯非類似。 是對位進行直接取反。
按位反規則如下:
~1 = 0;
~0 = 1;
先用 2 進行運算處理:
在進行 -2 的運算操作
-2 的原碼 需要轉換成補碼, 用補碼進行取反運算。 得到 1 的二進制。
代碼演示如下:
位異或 ^
位異或是基於二進制的位運算。 採用符號 XOR 在 Java 中使用 ^ 進行表示。兩個值相同取 0, 不同的取 1。
按位異或規則如下:
1 ^ 1 = 0;
0 ^ 0 = 0;
1 ^ 0 = 1;
0 ^ 1 = 1;
舉例 10 ^ 2
舉例 10 ^ -2
代碼演示結果的准確性:
異或在代碼優化和實際的工作中會經常用到。 後續實戰中用到了在詳細分析用法, 現在知道進行異或運算即可。
位左移 <<
將一個操作數進行二進制位往左移, 移動後空出來的低位用 0 進行填充。移除的高位捨去。高位丟棄,低位補零。
操作數 << 移動的位數
舉例說明 10 << 2
位左移代碼演示:
位右移 >>
將一個操作數進行二進制往右移, 移動後,有兩種情況,一種有無符號一種是有符號。也就是最高位為 0 移動後高位補 0, 如果最高位(符號位)為 1, 移動後空缺位都為 1.
操作數 >> 移動的位數
舉例說明 10 >> 2
對於負數舉例 -2 >> 2 空缺位補 1:
位右移代碼演示:
注意這兩者的區別。
無符號位右移 >>>
這個是和右移操作上是一致的, 但是不管是否最高位(符號位)為 1, 空缺位都使用 0 進行補齊。
操作數 >>> 移動的位數
舉例說明 10 >>> 2
對於負數來說。 這里有點區別, 因為對於負值來說, 上面其實都是 32 位, 為了讓大家看起來舒服轉換成了對應的 8 位的。 因為無符號位右移會改變正負值, 所以 32 位的負值和 8 位的負值是不一致的。
並且 Java 在處理 byte, short , char 等值進行移位操作前, 會先將類型轉換成 int 因為 int 佔用 32 位。
所以 -2 >>> 2 的時候,8 位運算應該是如下:
因為會先轉換成 32 位。 所以 32 位的 -2 等於如下:
也就是結果: 1073741823
無符號位右移代碼如下:
理解原理。 更能發現問題。
類型比較運算符
這里說的類型比較是對象的比較。 判斷每個定義的變數是否是某個類。該類可以是(介面、抽象類)。
語法規則:
boolean = 變數 instanceof 類
舉例說明:
運行查看結果:
這里需要注意:
null 值是沒有引用的, 所以和任何值都不相等。
instanceof 比較的是引用類型, 不能用於基礎類型的比較。
條件(三目)運算符
三目運算在 Java 中只有一個就是 ? :
三目運算的語法格式:
大部分情況下, 對於三目運算是 if 和 else 的簡寫。舉例說明:
運算符的優先順序
所有的數學運算都是從左向右進行運算的, 對於 Java 來說大部分運算也是遵守從左向右的規則。 但是一元運算符,賦值運算符和三目運算符例外。他們是從右向左進行運算。
運算符的內容告一段落, 接下來就是開始邏輯表達式的學習。 教程編寫不易。希望各位大看官點贊收藏加關注。更多內容大放送。
6. java中字元串異或的原理
存在按位異或,就是根據數據在內存中的二進制數的存放形式進行異或操作,
但是不存在字元串的異或
如果在內存中的數據:01010101和10101010異或,結果就是11111111,然後再將
11111111轉換成相應的數據輸出結果
注意:Java中沒有字元串的異或、與、或、非操作,不是C語言那樣(除非是你自己定義異或操作)
7. java中按位異或與邏輯異或的區別
邏輯沒有異或運算。
位異或指:異或運算^,異或運算它都是以二進制數據為基礎進行運算,1^1=00^0=11^0=10^1=1
8. java中a=a^b;b=a^b;a=a^b;它的變化詳細過程是怎樣的
^int a= 10; // 00001010(二進制)
int b= 5; // 00000101(二進制)
∵0^0=0,1^1=0,0^1=1,1^0=1
∴00001010^00000101=00001111
∵二進制00001111=十進制15
∴a^b = 15
例如:
位運算是C語言的一大特色,利用異或運算可以實現交換兩個數,原理是一個整數與另外一個數進行兩次異或運算仍然是其本身,基本原理用式子表達如下:
(1) A ^ A = 0;
(2) A = A ^B;
(3) B = A ^B;(相當於B = A ^ B ^ B ,即 B = A)
(4) A= A ^ B;(相當於A = A ^B ^A ,即A = B)
利用位運算不僅提高了代碼的執行速度,而且此處還減少了對輔助變數的需求,因此提高了程序的效率。
(8)java按位異或擴展閱讀:
歸零律:a ⊕ a = 0
恆等律:a ⊕ 0 = a
交換律:a ⊕ b = b ⊕ a
結合律:a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
自反:a ⊕ b ⊕ a = b.
d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
若x是二進制數0101,y是二進制數1011;
則x⊕y=1110
只有在兩個比較的位不同時其結果是1,否則結果為0
即「兩個輸入相同時為0,不同則為1」!