2016-02-09 24 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); 
相关问题