我正在编写一个修改二进制文件的C#程序。在文件中有一个字节,用于存储所有人穿着的信息。
示例:
1 =帽子
2 =鞋子
4 =袜子
8 =裤子
16 =衬衫
32 =眼镜
64 =观看
128 =耳环
Sally穿着鞋子,裤子和衬衫= 2 + 8 + 16 = 26.存储的字节 26 。
弗雷德戴着帽子,鞋子,袜子,颜料,衬衫,眼镜和手表:1 + 2 + 4 + 8 + 16 + 32 + 64 = 127.存储的字节 127现在我想拿出那个号码并弄清楚他们穿什么。一个人不能穿两件相同的东西,只有8个选项。
答案 0 :(得分:4)
您有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
仅供参考:我猜你是通过向累加器添加2的幂来设置位掩码:
byte SetWatch(byte bitMask) {
return bitMask + 64;
}
您也可以使用按位操作来执行此操作。像这样使用按位“或”:
byte SetWatch(byte bitMask) {
return bitMask | 64;
}
答案 1 :(得分:2)
使用带有[Flags]
属性的枚举,然后使用HasFlag
方法确定枚举的给定实例是否设置了该标志。
https://msdn.microsoft.com/en-us/library/system.enum.hasflag(v=vs.110).aspx
答案 2 :(得分:0)
您可以使用this technique。
使用Sally引用您的示例:
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
答案 3 :(得分:0)
您可以使用逐位运算符来解决这个问题。
{{1}}