位运算的一些用例
位運(yùn)算的一些用例
位運(yùn)算
幾乎每種編程語言都為我們提供一種運(yùn)算,它直接操作二進(jìn)制數(shù)據(jù),這種運(yùn)算叫做位運(yùn)算。
位運(yùn)算分為移位、取反、與、或、異或、非,其中移位又包括左移位、右移位、左無符號(hào)移位、右無符號(hào)移位。
| 與 | a & b |
| 或 | a | b |
| 異或 | a ^ b |
| 非(取反) | ~a |
| 左移 | a< |
位運(yùn)算的用例一—權(quán)限控制
假設(shè)有這么一個(gè)場景,需要對(duì)某個(gè)文件設(shè)置權(quán)限,假設(shè)有三種權(quán)限需要設(shè)置:讀、寫、執(zhí)行。那么通常的做法可能就是采用三個(gè)布爾值來存儲(chǔ)當(dāng)前的權(quán)限。
那么寫法通常可能是這樣:
上面這種寫法可能是比較常見的,比較符合我們的思維習(xí)慣,但是使用位運(yùn)算中掩碼的概念來改寫這個(gè)例子,會(huì)使得更加簡潔、高效。
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;//默認(rèn)沒有任何權(quán)限public Permission() {}public Permission(byte permission) {this.permissionMask = permission;}//增加一項(xiàng)或者多項(xiàng)權(quán)限public void enable(byte permission) {this.permissionMask |= permission;}//禁用一項(xiàng)或多項(xiàng)的權(quán)限public void disable(byte permission) {this.permissionMask &= ~permission;}//查詢一項(xiàng)或多項(xiàng)權(quán)限是否被啟用public boolean isAllowed(byte permission) {return this.permissionMask & permission == permission;}//查詢一項(xiàng)或多項(xiàng)權(quán)限是否被禁用public boolean isDisAllowed(byte permission) {return this.permissionMask & permission == 0;} }這種寫法明顯表達(dá)的信息量要多于第一種寫法,舉個(gè)例子:現(xiàn)在要同時(shí)啟用三種權(quán)限,那么第一種寫法就是:
setIsAllowedRead(true);setIsAllowedWrite(true);setIsAllowedExecution(true);而第二種寫法就是:
enable(Permission.ALLOW_READ | Permission.ALLOW_WRITE | Permission.ALLOW_EXECUTION);這種寫法對(duì)于使用Permission類的時(shí)候來說,方便許多。在Linux系統(tǒng)中設(shè)置權(quán)限時(shí)通常會(huì)用到
bash
chmod 777 file
其中777就是1111111 | 1111111 | 1111111,可見Linux里面也是采用位運(yùn)算中的掩碼來設(shè)置文件權(quán)限的。
用位運(yùn)算的方式來實(shí)現(xiàn)這個(gè)權(quán)限控制的優(yōu)點(diǎn)是:高效,位運(yùn)算比較接近與機(jī)器的運(yùn)算方式;簡潔,無論試編寫還是使用都比較方便簡潔。
缺點(diǎn):代碼不夠直觀,可讀性差,當(dāng)維護(hù)這段代碼的時(shí)候可能比較惱火, 不如第一種寫法一目了然。
通常如果需要維護(hù)n個(gè)開關(guān)變量(二值變量)的時(shí)候,只需要n位二進(jìn)制的整數(shù)和數(shù)個(gè)mask即可,完成狀態(tài)的保存和查詢。這種寫法在Android SDK里面是非常常見的。
可以加以推廣,如果需要保存n個(gè)具有m種狀態(tài)的變量,那么需要一個(gè)n位m進(jìn)制的數(shù)即可完成。
?
轉(zhuǎn)載于:https://www.cnblogs.com/Spground/p/8536149.html
總結(jié)
- 上一篇: python开发【第四篇】:python
- 下一篇: 2017-2018-1 20155209