導航:首頁 > 編程語言 > java比特

java比特

發布時間:2023-12-16 22:16:14

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的字元類型採用的是Unicode編碼方案,一個字元2個位元組,一個位元組8個比特位,
所以是16位

閱讀全文

與java比特相關的資料

熱點內容
口袋妖怪銀魂安卓v11 瀏覽:1
網站上芒果tv的賬號都是什麼 瀏覽:104
帶公式的表格如何刷新數據 瀏覽:81
數據標注語音和2d哪個好 瀏覽:145
保存excel文件的方法 瀏覽:655
手機上看不到電腦上的文件 瀏覽:626
關於ps的微信公眾號 瀏覽:612
矩陣論教程 瀏覽:971
字體文件分系統嗎 瀏覽:921
編程一級考試要帶什麼證件 瀏覽:923
extjs表格修改前數據 瀏覽:612
什麼是資料庫的函數 瀏覽:722
oppo手機怎麼用數據線連接電腦 瀏覽:247
恆智天成備份文件在哪裡 瀏覽:976
電腦沒聯網怎麼拷貝文件 瀏覽:224
wps工具欄怎麼換成中文 瀏覽:338
win7和xp共享文件 瀏覽:883
蘋果4代音量鍵沒反應 瀏覽:827
怎樣打開tif文件 瀏覽:153
java下載文件zip 瀏覽:440

友情鏈接