中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的位運算實例代碼分析

發布時間:2023-04-11 15:49:15 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

今天小編給大家分享一下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 << k)

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

表達式位:x = x & ~(1 << k)

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 << n

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

推薦使用位運算的原因:

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

以上就是“Java的位運算實例代碼分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

渑池县| 克什克腾旗| 武穴市| 天祝| 安达市| 延津县| 高安市| 高平市| 灵璧县| 普陀区| 汪清县| 赤壁市| 宁津县| 德格县| 交口县| 太原市| 安庆市| 葫芦岛市| 东光县| 湟源县| 襄樊市| 保德县| 惠州市| 来宾市| 高密市| 金华市| 安多县| 涞源县| 洪江市| 镇原县| 棋牌| 德安县| 兴化市| 隆子县| 图片| 宁国市| 红河县| 新安县| 乌兰县| 璧山县| 平昌县|