日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

位运算的一些用例

發布時間:2025/3/20 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 位运算的一些用例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

位運算的一些用例

位運算

幾乎每種編程語言都為我們提供一種運算,它直接操作二進制數據,這種運算叫做位運算。

位運算分為移位、取反、與、或、異或、非,其中移位又包括左移位、右移位、左無符號移位、右無符號移位。

含義Java寫法
a & b
a | b
異或a ^ b
非(取反)~a
左移a<

位運算的用例一—權限控制

假設有這么一個場景,需要對某個文件設置權限,假設有三種權限需要設置:讀、寫、執行。那么通常的做法可能就是采用三個布爾值來存儲當前的權限。
那么寫法通常可能是這樣:

public class Permission {private boolean is_allowed_read = false;private boolean is_allowed_write = false;private boolean is_allowed_execution = false;public Permission() {}public Permission(boolean is_allowed_read, boolean is_allowed_write, boolean is_allowed_execution) {this.is_allowed_read = is_allowed_read;this.is_allowed_write = is_allowed_write;this.is_allowed_execution = is_allowed_execution;}public void setIsAllowedRead(boolean is_allowed_read) {this.is_allowed_read = is_allowed_read;}public boolean getIsAllowedRead() {return this.is_allowed_read;}public void setIsAllowedWrite(boolean is_allowed_write) {this.is_allowed_write = is_allowed_write;}public boolean getIsAllowedWrite() {return this.is_allowed_write;}public void setIsAllowedExecution(boolean is_allowed_execution) {this.is_allowed_execution = is_allowed_execution;}public boolean getIsAllowedExecution() {return this.is_allowed_execution;} }

上面這種寫法可能是比較常見的,比較符合我們的思維習慣,但是使用位運算中掩碼的概念來改寫這個例子,會使得更加簡潔、高效。

public class Permission {private final static byte Allowe_Read = 1 << 0;//00000001private final static byte Allowe_Write = 1 << 1;//00000010private final static byte Allow_Execution = 1 << 2;//00000100private byte permissionMask = 0x00;//默認沒有任何權限public Permission() {}public Permission(byte permission) {this.permissionMask = permission;}//增加一項或者多項權限public void enable(byte permission) {this.permissionMask |= permission;}//禁用一項或多項的權限public void disable(byte permission) {this.permissionMask &= ~permission;}//查詢一項或多項權限是否被啟用public boolean isAllowed(byte permission) {return this.permissionMask & permission == permission;}//查詢一項或多項權限是否被禁用public boolean isDisAllowed(byte permission) {return this.permissionMask & permission == 0;} }

這種寫法明顯表達的信息量要多于第一種寫法,舉個例子:現在要同時啟用三種權限,那么第一種寫法就是:

setIsAllowedRead(true);setIsAllowedWrite(true);setIsAllowedExecution(true);

而第二種寫法就是:

enable(Permission.ALLOW_READ | Permission.ALLOW_WRITE | Permission.ALLOW_EXECUTION);

這種寫法對于使用Permission類的時候來說,方便許多。在Linux系統中設置權限時通常會用到

bash
chmod 777 file

其中777就是1111111 | 1111111 | 1111111,可見Linux里面也是采用位運算中的掩碼來設置文件權限的。

用位運算的方式來實現這個權限控制的優點是:高效,位運算比較接近與機器的運算方式;簡潔,無論試編寫還是使用都比較方便簡潔。
缺點:代碼不夠直觀,可讀性差,當維護這段代碼的時候可能比較惱火, 不如第一種寫法一目了然。

通常如果需要維護n個開關變量(二值變量)的時候,只需要n位二進制的整數和數個mask即可,完成狀態的保存和查詢。這種寫法在Android SDK里面是非常常見的。
可以加以推廣,如果需要保存n個具有m種狀態的變量,那么需要一個n位m進制的數即可完成。

?

轉載于:https://www.cnblogs.com/Spground/p/8536149.html

總結

以上是生活随笔為你收集整理的位运算的一些用例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。