找出加在一起的字节数等于另一个字节

时间:2016-02-09 21:31:08

标签: c#

我正在编写一个修改二进制文件的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个选项。

4 个答案:

答案 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}}