利用bitwise操作來處理參數

有時候我們會需要讀取、設定一些參數,例如電風扇要不要自動關機、電風扇要不要接受遙控、要不要自爆什麼的,這時我們可以用

fanAutoShutdown、fanRemoteControl、fanExplode三個boolean參數,但是我們也可以針對同一個東西只用一個短整數來做。

首先設定 fanAutoShutdown=1fanRemoteControl=2fanExplode=4fanParameter1=8fanParameter2=16

注意到了嗎? 值就是2的n次方。

然後我們用status這個整數來表示所有參數,如果fanAutoShutdown跟fanRemoteControl都有被設定為true,其它幾個都沒有,status就等於fanAutoShutdown+fanRemoteControl=3。3用二進制來表示就是0011 = 2的1次方+2的0次方。每個參數都是2的某個次方,這參數等於true時,就相當於在二進制的相對應位置是1,反之則是0。

那我們要怎麼做運算? 用 & (AND) 跟 | (OR)。現在我們假設status的值是7好了,7=0111

fanAutoShutdown = 0001,fanAutoShutdown & status = 0001 & 0111 = 0001 = fanAutoShutdown 可以知道自動關機的設定是開啟的。

fanRemoteControl = 0010,fanRemoteControl & status = 0010 & 0111 = 0010 = fanRemoteControl。

fanExplode = 0100,fanExplode & status = 0100 & 0111 = 0100 = fanExplode。

fanParameter1 = 1000,fanExplode & status = 1000 & 0111 = 0000 可以知道fanParameter1這個參數沒設定。

所以我們可以用一個函數,假設叫做has(),則

如果回傳值是true,就表示param這個參數有設定。

那我們怎麼把值放進status? 用OR。

status =0;

status & fanExplode = 0000 | 0100 = 0100;

status & fanRemoteControl = 0100 | 0010 = 0110 = 6

那要怎麼取消某個參數的設定呢? 把status跟參數做XOR運算即可。

status = 6 = 0110

status & fanExplode = 0110 ^ 0100 = 0010 只留下fanRemoteControl。

XOR的真值表是

把A看成status,把B看成你要設定的參數,參數為 0 是不會發生的,所以0 XOR 1=1,1 XOR 1 = 0 剛好是反相,也就是取消掉那個參數。

 

 

 

Leave a Reply

你的電子郵件位址並不會被公開。 必要欄位標記為 *