2016-02-09 27 views
1

我正在編寫修改二進制文件的C#程序。在文件中有一個字節存儲關於一個人穿着的所有信息。找出加在一起的字節數等於另一個字節

實施例:

1 =帽子

2 =鞋

4 =襪子

8 =褲子

16 =襯衫

32 =眼鏡

64 =觀看

128 =耳環

薩利穿着鞋子,褲子和襯衣= 2 + 8 + 16 = 26,所存儲的字節是。

佛瑞德被戴帽子,鞋,襪子,油漆,襯衫,眼鏡和手錶:1 + 2 + 4 + 8 + 16 + 32 + 64 = 127所存儲的字節是

現在我想拿這個數字,並找出他們正在穿什麼。一個人不能穿兩件相同的東西,只有8種選擇。

回答

3

你有bit mask

使用您的2 + 8 + 16 = 26示例,可以使用按位「和」運算符&來提取每位數。要檢查,如果該人穿着鞋「和」位掩碼2,檢查結果:

011010 = 26 
& 000010 = 2 <-- bitwise "and" operator 
------------- 
    000010 = 2 

如果掩碼是5,而不是26,其結果必然是:

000101 = 5 
& 000010 = 2 <-- bitwise "and" operator 
------------- 
    000000 = 0 

因此,採取結果,並檢查它是否大於零。就是這樣:

bool isHat = bitMask & 1 > 0; 
bool isShoes = bitMask & 2 > 0; 
bool isSocks = bitMask & 4 > 0; 
//and so on 

FYI:我猜你是通過增加的兩個大國像這樣蓄能器設置你的位掩碼:

byte SetWatch(byte bitMask) { 
    return bitMask + 64; 
} 

您還可以使用按位操作來做到這一點。使用按位「或」像這樣:

byte SetWatch(byte bitMask) { 
    return bitMask | 64; 
} 
0

您可以使用this technique

引用您的示例與莎莉:

26/2 = 13 , Remainder = 0 <-- Hat 

13/2 = 6 , Remainder = 1 <-- Shoes 

6/2 = 3 , Remainder = 0 <-- Socks 

3/2 = 1 , Remainder = 1 <-- Pants 

1/2 = 0 , Remainder = 1 <-- Shirt 
0

可以使用位運算符摸不着頭腦。

var outfit = 26; //this is the same as 2 & 8 & 16 
var bIsWearingPants = ((outfit | 8) != 0); 
相關問題