用標誌位表示狀態

2021-09-24 19:53:14 字數 2936 閱讀 6908

在很多框架中, 我們都能看到類似 int *** = 0x0010 這種**, 我們只知道他表示狀態, 很牛x, 但是具體為啥要這樣, 或者它是如何表示多個不同狀態的卻全然不知.

回顧位運算

位運算符號列表

符號英文名

中文名\or或

&and與~

not非

^xor

異或》-右移

<<-左移

>>>

-無符號右移(最高位始終補0)

每種運算子的運算方式

1|0

// 1, 兩個有乙個 1 結果為 1, 其他情況都為 01&

0// 0 兩個都為 1 結果為 1, 其他情況都為 0~1

// 0 單目運算, 取運算值的反值1^

0// 1 參與運算的兩個值不同, 則為 1, 相同則為 0

1<<

1// 10 將左邊的值 左移 指定位數

1010

>>

1// 101 將左邊值 右移 指定位數

標誌位: 將乙個整數的某一位作為標誌位, 並賦予特定的含義

假如我們要儲存乙個使用者的增刪查改許可權, 四種許可權組合, 一共有 16 中狀態.

public

static

int none =0;

public

static

int add =1;

public

static

int delete =2;

public

static

int read =4;

public

static

int update =

8;

我們通過這幾種值表示是否在某個方向,為什麼要用這些特定的值?

1

=00012=

00104=

01008=

1000

這些值都是 2 的次冪, 將這些值轉換為二進位制, 發現每個值有乙個位是 1 其他都是 0, 並且相同位不重複

這樣, 每個狀態參與位運算始終只影響該轉態位的值

再定義乙個表示許可權的標識 permission, 預設是無任何許可權

假如需要新增 read, add 許可權

permission |= add | read;

// 0 | 0001 | 0100 = 0101

/**0000

0001

0100

----

0101

*/

我們新增了兩個許可權, 分別是 add , read, 則這兩個標誌位的的值變成了 1

如何檢查是否擁有某個許可權

boolean canread =

(permission & read)!=0

// 0101 & 0100 = 0100 = add

/**0101

0100

----

0100

*/

如何移除某個許可權

permission ^= read

// 0101 ^ 0100 = 0001

/**0101

0100

----

0001

*/

另一方式移除某個許可權

permission &=

~ read

// 0101 & 1011 = 0001

/** ~0100

----

1011

&0101

----

0001

*/

標誌位的優勢

標誌位可以減少很多**, 理解簡單

如果我們用乙個 boolean 給乙個物件新增 read 和 add 許可權

setcanread

(true);

setcanadd

(true);

setcanupdate

(false);

setcandelete

(false

);

用標誌位

addpermission

(read | add)

;

用 boolean 判斷是否擁有 read 和 add 許可權

iscanread()

;iscanadd()

;

用標誌位

haspermission

(add | read)

;

用 boolean 判斷是否擁只有 read 和 add 許可權

iscanadd

() iscanread &&

!iscanupdate()

&&!iscandelete

()

用標誌位

isjustallow

(read | add)

;

上例中的**

class

permission

public

boolean

haspermission

(int permission)

public

boolean

isjustallow

(int permission)

public

void

removepermission

(int permission)

}

**:

C I O庫流狀態標誌位

再來看看輸入狀態標記位 狀態測試函式 狀態設定函式之間的關係 輸入狀態標記位常量有以下幾個 標記位常量 常量 含義 failbit標記位的值 eofbit標記位的值 badbit標記位的值 轉化為10進製 ios failbit 輸入 輸出 流出現非致命錯誤,可挽回 1 0 0 4 ios badb...

微機原理 標誌位及debug下的表示

debug中的標誌位顯示順序 of df if sf zf af pf cf of 溢位標誌位。記錄了有符號運算的結果是否發生了溢位,如果發生溢位of 1,如果沒有of 0。of 1,顯示ov of 0,顯示nv 影響of的指令 inc df 方向標誌位。在串處理指令中,每次操作後,如果df 0,s...

用列舉值表示狀態 選項 狀態碼

一 c語言中 1 c語言中的列舉型別enum。在以一系列常量來表示錯誤狀態碼或可組合的選項時,極宜使用列舉為其命名。2 定義乙個enum enum personagestate property nonatomic,assign enum personagestate personage enum ...