日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

位运算的一些用例

發(fā)布時(shí)間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 位运算的一些用例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

位運(yùn)算的一些用例

位運(yùn)算

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

位運(yùn)算分為移位、取反、與、或、異或、非,其中移位又包括左移位、右移位、左無符號(hào)移位、右無符號(hào)移位。

含義Java寫法
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)限。
那么寫法通常可能是這樣:

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;} }

上面這種寫法可能是比較常見的,比較符合我們的思維習(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é)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。