搜尋
首頁Javajava教程Java位元運算範例程式碼分析

位元運算

很久以前學習過位元運算,但是很久不用,感覺都忘得差不多了。最近看了幾處位運算的程式碼,發現都看不懂了,哈。也是時候回來補一補基礎了。

程式中的所有數字在電腦記憶體中都是以二進位的形式儲存的。位元運算就是直接對整數在記憶體中的二進位位元進行操作。

位元運算的運算子:

#運算子 意義
& 按位元與
| 位元或
~ 按位元取反
^ 以位元異或
左移
>> 帶符號右移
>> ;> 無符號右移

這些算是很基礎的知識了,但是太久不用,還是難免會遺忘了,在編碼的同時,可以多多使用!

Talk is cheap, show me the code.

#說明:單獨討論這些確實是很難看到應用的地方,如果有不太清楚的可以去看看其他人的總結。

我們以一個程式碼來看看位元運算的應用:

public final void writeInt(int v) throws IOException {
	  out.write((v >>> 24) & 0xFF);
	  out.write((v >>> 16) & 0xFF);
	  out.write((v >>>  8) & 0xFF);
	  out.write((v >>>  0) & 0xFF);
	  incCount(4);
}

這段程式碼是DataOutputStream 類別中的一個方法,用來將一個int 型的整數寫入流中。這個方法的命名是很有趣的,它和 OutputStream 中的 public abstract void write(int b) throws IOException 這個方法是完全不同的。這個方法的參數似乎是表示它可以將一個 int 型整數寫入流中,但是方法的功能不是靠猜測的,而是要看方法的描述。

public abstract void write(int b) throws IOException

API 中的介紹:

Writes the specified byte to this output stream. The general contract for write is that one byte is written to the output stream. The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.

它是將一個特定的位元組寫入流中,我們知道一個int型變數佔32位,一個byte佔8位,所以一個小於256(2^8)的int型整數和byte型整數的最後8位是相同的。

因此這個方法是寫入一個int型變數的最低8位,而將剩下的24位忽略。使用這個方法的時候,要格外注意!

The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.

所以,將一個int型的變數完整的寫入流中,並不是一個很簡單的問題。讓我們再回到上面這端程式碼: 它是連續四次寫入,每次寫入一個位元組的數據,這樣一個int型的變量,就被變成4個位元組寫入流中了。

out.write((v >>> 24) & 0xFF); 這個方法就是上面的寫入較低的8位數字,這個具體實作是對應的子類提供的。

我們來看看圖解: 一個簡單的與運算:可以看出運算的結果是保留了低8位,這個就是(v>>>24) & 0xFF運算的結果。

Java位元運算範例程式碼分析

那麼要如何取得高8位元的值呢?這就要使用移位運算進行操作了:

Java位元運算範例程式碼分析

透過進行移位操作,就可以取得每8位元的數據,然後再進行位元與& 運算,就可以將一個int型整數完全的寫入流中了。

程式碼示範

程式碼
package dragon;

/**
 * 分析这一个方法,目前水平有限,先从最简单的做起!
 * */

//		   public final void writeInt(int v) throws IOException {
//        out.write((v >>> 24) & 0xFF);
//        out.write((v >>> 16) & 0xFF);
//        out.write((v >>>  8) & 0xFF);
//        out.write((v >>>  0) & 0xFF);
//        incCount(4);
//    }


//上面这段代码是将一个32位整型,写入输出流。
//并且是将32位整型分为4个部分,每次写入8位。
//这是Java的特性。


public class DataOutputStreamAnalysis {
	public static void main(String[] args) {
		DataOutputStreamAnalysis analysis = new DataOutputStreamAnalysis();
		analysis.analysis(65535);
	}
	
	public void analysis(int number) {
		int number1, number2, number3, number4;  //后面的数字表示是一个32位整型的第几个8位。
		number1 = (number >>> 24) & 0xFF;    
		number2 = (number >>> 16) & 0xFF;    
		number3 = (number >>> 8) & 0xFF;
		number4 = (number >>> 0) & 0xFF;
		
		
		
		System.out.println(this.format(Integer.toBinaryString(number))+"  原始数据"); 
		System.out.println(this.format(Integer.toBinaryString(number1))+"  原始数据第一个8位");
		System.out.println(this.format(Integer.toBinaryString(number2))+"  原始数据第二个8位");
		System.out.println(this.format(Integer.toBinaryString(number3))+"  原始数据第三个8位");
		System.out.println(this.format(Integer.toBinaryString(number4))+"  原始数据第四个8位");
	}
	
	/**
	 * 输入一个二进制字符串,将其格式化,因为整型是
	 * 占32位的,但是转换成的二进制字符串,并没有32位*/
	public String format(String bstr) {
		int len = bstr.length();
		StringBuilder sb = new StringBuilder(35);
		for (int i = 0; i < 32-len; i++) {
			sb.append("0");
		}
		sb.append(bstr);
		sb.insert(8, " ");
		sb.insert(17, " ");
		sb.insert(26, " ");   //前面插入一个字符后,所有字符的索引都变了!
		return sb.toString();
	}
}
結果

Java位元運算範例程式碼分析

#說明: 這裡沒有考慮負數的情況,不過都是一樣的,只是負數的表示相對麻煩一點而已。只要理解正數,負數也不是什麼問題了。

位元運算的應用

1.判斷int 型變數x是奇書還是偶數

將變數x 和1 進行位元與運算,如果結果為0,則變數x為偶數,否則為奇數。

if (x & 1 ==0) 
	System.out.println("x是偶数");
if (x & 1 == 1) 
    System.out.println("x是奇数");

說明:這個還是很好理解的,因為偶數的最後移位一定是 0。 (二進位表示)

2.取int 型變數x 的第k 位 將變數x 右移k 位,再和1進行邏輯與運算,結果即為變數x 第k位的二進制值。

表達式:x >> k & 1 (建議加上括號,這樣顯得更加清晰明了。)

3.將int 型變數x 的第k 位置1 將1 左移k 位,再和變數x 進行邏輯或運算,則將變數x 的第k 位置1,其它位保持不變。

表達式:x = x | (1

#4.將int 型變數的第k 位元清除0 將1 左移k 位元再取反,將其結果再和變數下進行邏輯運算,則將變數x 的第k 位元清0,其它位元保持不變。

表達式位元:x = x & ~(1

#5.計算兩個整數的平均值

表達式位元:(x & y) ((x ^ y) >> 1)

6.對於大於1 的整數x ,判斷x 是不是2 的冪

if (x & (x-1) == 0)
	System.out.println("x是2的次幂");

7.將一個數乘以2 的n 次方

表達式:x = x

例如:將x 擴大2 倍:x = x

建議使用位元運算的原因:

位元運算的速度是快於算術運算的,因為位元運算需要的指令少,執行所需要的時間就少,會顯得很快,但是只有在大量執行的情況下才能看出來位運算的優點。畢竟現在的計算機已經越來越快了。

以上是Java位元運算範例程式碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強鍵入如何有助於平台獨立性?Java的強鍵入如何有助於平台獨立性?Apr 25, 2025 am 12:11 AM

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

說明Java本機界面(JNI)如何損害平台獨立性。說明Java本機界面(JNI)如何損害平台獨立性。Apr 25, 2025 am 12:07 AM

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

是否有任何威脅或增強Java平台獨立性的新興技術?是否有任何威脅或增強Java平台獨立性的新興技術?Apr 24, 2025 am 12:11 AM

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

JVM的實現是什麼,它們都提供了相同的平台獨立性?JVM的實現是什麼,它們都提供了相同的平台獨立性?Apr 24, 2025 am 12:10 AM

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性如何降低發展成本和時間?平台獨立性如何降低發展成本和時間?Apr 24, 2025 am 12:08 AM

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具