在很多框架中, 我們都能看到類似 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 ...