位运算的一些用例
位運算的一些用例
位運算
幾乎每種編程語言都為我們提供一種運算,它直接操作二進制數據,這種運算叫做位運算。
位運算分為移位、取反、與、或、異或、非,其中移位又包括左移位、右移位、左無符號移位、右無符號移位。
| 與 | a & b |
| 或 | a | b |
| 異或 | a ^ b |
| 非(取反) | ~a |
| 左移 | a< |
位運算的用例一—權限控制
假設有這么一個場景,需要對某個文件設置權限,假設有三種權限需要設置:讀、寫、執行。那么通常的做法可能就是采用三個布爾值來存儲當前的權限。
那么寫法通常可能是這樣:
上面這種寫法可能是比較常見的,比較符合我們的思維習慣,但是使用位運算中掩碼的概念來改寫這個例子,會使得更加簡潔、高效。
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
總結
- 上一篇: python开发【第四篇】:python
- 下一篇: 2017-2018-1 20155209