當前位置:首頁 » 編程語言 » 位運算符java

位運算符java

發布時間: 2022-06-28 19:09:44

java位運算符

位操作符(bitwise operator)
位操作符允許我們操作一個基本數據類型中的整數型值的單個「比特(bit)」,即二進制位。
位操作符會對兩個參數對應的位執行布爾代數運算,並最終生成一個結果。

位操作符來源於 C 語言面向底層的操作,那時我們經常需要直接操縱硬體,設置硬體寄存
器內的二進制位。Java的設計初衷是嵌入電視機頂盒內,所以這種低級操作仍被保留了下來。
但是,我們可能不會過多地使用到位運算符。

如果兩個輸入位都是 1,則按位「與」操作符(&)生成一個輸出位 1;否則生成一個輸出
位0。如果兩個輸入位里只要有一個是1,則按位「或」操作符(|)生成一個輸出位1;只
有在兩個輸入位都是0的情況下,它才會生成一個輸出位0。如果兩個輸入位的某一個是1,
但不全都是1,那麼「異或」操作(^)生成一個輸出位1。按位「非」(~ ,也稱為取補運
算,ones compliement operator )屬於一元操作符;它只對一個操作數進行操作(其他位操
作是二元運算)。按位「非」生成與輸入位相反的值——若輸入0,則輸出1;輸入1,則輸
出0。

位操作符和邏輯操作符都使用了同樣的符號。因此,我們能方便地記住它們的含義:由於「位」
是非常「小」的,所以位操作符僅使用了一位符號。

位操作符可與等號(=)聯合使用,以便合並運算操作和賦值操作:&=,|=和^=都是合法
的(由於~是一元操作符,所以不可與=聯合使用)。

我們將布爾類型(boolean)作為一種「單比特」值對待,所以它多少有些獨特的地方。我們

可對它執行按位「與」、「或」和「異或」運算,但不能執行按位「非」(大概是為了避免與
邏輯 NOT 混淆)。對於布爾值,位操作符具有與邏輯操作符相同的效果,只是它們不會中
途「短路」。此外,針對布爾值進行的按位運算為我們新增了一個「異或」邏輯操作符,它並
未包括在「邏輯」操作符的列表中。在移位表達式中,我們被禁止使用布爾運算,原因將在下
面解釋。

移位操作符(shift operator)
移位操作符操作的運算對象也是二進制的「位」,但是它們只可以被用來處理整數類型(基本
類型的一種)。左移位操作符(<<)能將操作符左邊的運算對象向左移動操作符右側指定的
位數(在低位補 0)。「有符號」右移位操作符(>>)則將操作符左邊的運算對象向右移動操
作符右側指定的位數。「有符號」右移位操作符使用了「符號擴展」:若符號為正,則在高位插
入0;若符號為負,則在高位插入1。Java中增加了一種「無符號」右移位操作符(>>>),它
使用了「零擴展」:無論正負,都在高位插入0。這一操作符是C或C++沒有的。

如果對char、byte或者short類型的數值進行移位處理,那麼在移位進行之前,它們會自動
轉換為int,並且得到的結果也是一個int類型的值。而右側操作數,作為真正移位的位數,
只有其二進製表示中的低5位才有用。這樣可防止我們移位超過int型值所具有的位數。(譯
註:因為2的5次方為32,而int型值只有32位)。若對一個long類型的數值進行處理,
最後得到的結果也是long。此時只會用到右側操作數的低6位,以防止移位超過long型數
值具有的位數。

移位可與等號(<<=或>>=或>>>=)組合使用。此時,操作符左邊的值會移動由右邊的值指
定的位數,再將得到的結果賦回左邊的變數。但在進行「無符號」右移結合賦值操作時,可能
會遇到一個問題:如果對byte或short值進行這樣的移位運算,得到的可能不是正確的結果。
它們會先被轉換成int類型,再進行右移操作。然後被截斷,賦值給原來的類型,在這種情
況下可能得到-1的結果。下面這個例子演示了這種情況:

//: c03:URShift.java
// Test of unsigned right shift.
import com.bruceeckel.simpletest.*;

public class URShift {
static Test monitor = new Test();
public static void main(String[] args) {
int i = -1;
System.out.println(i >>>= 10);
long l = -1;
System.out.println(l >>>= 10);
short s = -1;
System.out.println(s >>>= 10);
byte b = -1;
System.out.println(b >>>= 10);

b = -1;
System.out.println(b>>>10);
monitor.expect(new String[] {
"4194303",
"18014398509481983",
"-1",
"-1",
"4194303"
});
}
} ///:~

在最後一個移位運算中,結果沒有賦回給b,而是直接列印出來,所以其結果是正確的。

下面這個例子向大家闡示了如何應用涉及「按位」操作的所有操作符:

//: c03:BitManipulation.java
// Using the bitwise operators.
import com.bruceeckel.simpletest.*;
import java.util.*;

public class BitManipulation {
static Test monitor = new Test();
public static void main(String[] args) {
Random rand = new Random();
int i = rand.nextInt();
int j = rand.nextInt();
printBinaryInt("-1", -1);
printBinaryInt("+1", +1);
int maxpos = 2147483647;
printBinaryInt("maxpos", maxpos);
int maxneg = -2147483648;
printBinaryInt("maxneg", maxneg);
printBinaryInt("i", i);
printBinaryInt("~i", ~i);
printBinaryInt("-i", -i);
printBinaryInt("j", j);
printBinaryInt("i & j", i & j);
printBinaryInt("i | j", i | j);
printBinaryInt("i ^ j", i ^ j);
printBinaryInt("i << 5", i << 5);
printBinaryInt("i >> 5", i >> 5);
printBinaryInt("(~i) >> 5", (~i) >> 5);
printBinaryInt("i >>> 5", i >>> 5);

printBinaryInt("(~i) >>> 5", (~i) >>> 5);

long l = rand.nextLong();
long m = rand.nextLong();
printBinaryLong("-1L", -1L);
printBinaryLong("+1L", +1L);
long ll = 9223372036854775807L;
printBinaryLong("maxpos", ll);
long lln = -9223372036854775808L;
printBinaryLong("maxneg", lln);
printBinaryLong("l", l);
printBinaryLong("~l", ~l);
printBinaryLong("-l", -l);
printBinaryLong("m", m);
printBinaryLong("l & m", l & m);
printBinaryLong("l | m", l | m);
printBinaryLong("l ^ m", l ^ m);
printBinaryLong("l << 5", l << 5);
printBinaryLong("l >> 5", l >> 5);
printBinaryLong("(~l) >> 5", (~l) >> 5);
printBinaryLong("l >>> 5", l >>> 5);
printBinaryLong("(~l) >>> 5", (~l) >>> 5);
monitor.expect("BitManipulation.out");
}
static void printBinaryInt(String s, int i) {
System.out.println(
s + ", int: " + i + ", binary: ");
System.out.print(" ");
for(int j = 31; j >= 0; j--)
if(((1 << j) & i) != 0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
static void printBinaryLong(String s, long l) {
System.out.println(
s + ", long: " + l + ", binary: ");
System.out.print(" ");
for(int i = 63; i >= 0; i--)
if(((1L << i) & l) != 0)
System.out.print("1");
else
System.out.print("0");

System.out.println();
}
} ///:~

程序末尾調用了兩個方法:printBinaryInt()和printBinaryLong()。它們分別接受
一個 int 或 long 值的參數,並用二進制格式輸出,同時附有簡要的說明文字。你可以暫
時忽略它們具體是如何實現的。

請注意這里是用 System.out.print(),而不是 System.out.println()。print()方法不自動換行,所
以我們能在同一行里輸出多個信息。

上面的例子中,expect() 以一個文件名作參數,它會從這個文件中讀取預期的行(其中
可以有,也可以沒有正則表達式)。對於那些太長,不適宜列在書里的輸出,這種做法很有
用。這個文件的擴展名是「.out」,是所發布的代碼的一部分,可以從www.BruceEckel.com下
載。如果有興趣的話,可以打開這個文件,看看正確的輸出應該是什麼(或者你自己直接運
行一下前面這個程序)。

上面的例子展示了對int和long的所有按位運算的效果,還展示了int和long的最小值、最
大值、+1和-1值,以及它們的二進制形式,以使大家了解它們在機器中的具體形式。注意,
最高位表示符號:0為正,1為負。下面列出例子中關於int部分的輸出:

-1, int: -1, binary:

+1, int: 1, binary:

maxpos, int: 2147483647, binary:

maxneg, int: -2147483648, binary:

i, int: 59081716, binary:

~i, int: -59081717, binary:

-i, int: -59081716, binary:

j, int: 198850956, binary:

i & j, int: 58720644, binary:

i | j, int: 199212028, binary:

i ^ j, int: 140491384, binary:

i << 5, int: 1890614912, binary:


i >> 5, int: 1846303, binary:

(~i) >> 5, int: -1846304, binary:

i >>> 5, int: 1846303, binary:

(~i) >>> 5, int: 132371424, binary:


數字的二進製表示形式被稱為「有符號的2的補碼」。

② java 裡面位操作符有哪些

java
~
操作符,對每個二進制位的內容求反,即1變成0,0變成1
java
&
操作符,對應的二進制位進行與操作,兩個都為1才為1,其他情況均為0
java
|
操作符,對應的二進制位進行或操作,兩個都為0才為0,其他情況均為1
java
^
操作符
當對應二進制位值相同,該位為0
否則為1
java
<<
操作符,左邊移動,右面填充0
java
>>
操作符,左邊移動,右面填充0

③ 請教java位運算問題

Java 位運算 Java 位運算[轉]一,Java 位運算1.表示方法: 在Java語言中,二進制數使用補碼表示,最高位為符號位,正數的符號位為0,負數為1。補碼的表示需要滿足如下要求。 (l)正數的最高位為0,其餘各位代表數值本身(二進制數)。 (2)對於負數,通過對該數絕對值的補碼按位取反,再對整個數加1。2.位運算符 位運算表達式由操作數和位運算符組成,實現對整數類型的二進制數進行位運算。位運算符可以分為邏輯運算符(包括~、&、|和^)及移位運算符(包括>>、>)。1)左移位運算符()則將運算符左邊的運算對象向右移動運算符右側指定的位數。「有符號」右移位運算符使用了「符號擴展」:若值為正,則在高位插入0;若值為負,則在高位插入1。3)Java也添加了一種「無符號」右移位運算符(>>>),它使用了「零擴展」:無論正負,都在高位插入0。這一運算符是C或C++沒有的。

④ java語言中 位運算符怎麼計算的

都轉換成16進制,就好處理
00000000 00000000 00000000 00010011
00000000 00000000 00000000 00010100
結果
00000000 00000000 00000000 00010000
只有兩個位都是1,結果的位才是1 。

⑤ java 位運算符和邏輯運算符,有什麼區別,&和&&

true
=
1
false
=
0
再看下面這段文字
一、邏輯運算符:
包括:1。&&邏輯與
2。||邏輯或
3。!邏輯非
邏輯運算符用於對包含關系運算符的表達式進行合並或取非
對於使用邏輯運算符的表達式,返回0表示「假」,返回1表示「真」。關於邏輯運算符的解釋
請注意:任何使用兩個字元做符號的運算符,兩字元之間不應有空格,即將==寫成=
=是錯誤的。
假設一個程序在同時滿足條件a<10和b==7時,必須執行某些操作。應使用關系運算符和邏輯運算符「與」來寫這個
條件的代碼。用&&表示「與」運算符,該條件代碼如下:
(a<10)
&&
(b==7);
類似地,「或」是用於檢查兩個條件中是否有一個為真的運算符。它由兩個連續的管道符號(||)表示。如果上例
改為:如果任一語句為真,則程序需執行某些操作,則條件代碼如下:
(a<10)
||
(b==7);
第三個邏輯運算符「非」用一個感嘆號(!)表示。這個運算符對表達式的真值取反。例如,如果變數s小於10,程序
程序需執行某些操作,則條件代碼如下:
(s<10)

(!(s>=10))
//s不大於等於10
關系運算符和邏輯運算符的優先順序一般都低於算術運算符。例如,5>4+3的計算與5>(4+3)運算符是一樣的,即
先計算4+3,再執行關系運算。此表達示的結果為「假」,即,將返回0。
下面的語句
printf("%d",5>4+3);
將輸出
0
可以總結為:&&的結果是真真為真。||的結果是假假為假。
二、位運算符:
包括:1。&位與符
2。|位或符
3。^位異或符
4。~位取反符
以操作數12為例。位運算符將數字12視為1100。位運算符將操作數視為位而不是數值。數值
可以是任意進制的:十進制、八進制或十六進制。位運算符則將操作數轉化為二進制,並相應地返回1或0。
位運算符將數字視為二進制值,並按位進行相應運算,運算完成後再重新轉換為數字。例如:
表達式10&15表示(1010
&
1111),它將返回表示1010的值10。因為真真得真,或者是11得1,同位全是1結果也是1
表達式10|15表示(1010
|
1111),它將返回表示1111的值15。假假得假。全零得零。
表達式10^15表示(1010
^
1111),
它將返回表示0101的值5。此時是同性相斥,相同的就為假。
表達式~10表示(~1010),它將返回表示0101的值
-11。此號好理解,按位取反

⑥ 在JAVA中,位運算符到底是啥概念!

>> 右移,高位補符號位,被移出的丟棄;
>>> 無符號右移,高位補0,被移出的丟棄;
<< 左移,沒有無符號的;
a=-2,a是int,java中int是4個位元組,即a=;
其中最高位是符號位,負數是1,正數是0;

a>>>30後的結果賦給b,b=, 即3;

a>>30後的結果賦給b,b=, 即-1;

熱點內容
死神腳本 發布:2025-02-04 21:57:03 瀏覽:165
phpposthtml 發布:2025-02-04 21:37:46 瀏覽:87
最新asp源碼 發布:2025-02-04 21:17:33 瀏覽:570
讓linux死機 發布:2025-02-04 20:48:08 瀏覽:141
單方塊生存伺服器里如何獲取岩漿 發布:2025-02-04 20:48:07 瀏覽:785
快速指數演算法 發布:2025-02-04 20:20:40 瀏覽:299
python在類中定義函數調用函數 發布:2025-02-04 20:14:47 瀏覽:596
安卓手機的壁紙是哪個 發布:2025-02-04 20:14:44 瀏覽:202
java發展前景 發布:2025-02-04 20:10:19 瀏覽:77
mac登陸密碼哪裡設置 發布:2025-02-04 19:50:20 瀏覽:526