找出当什么字节加在一起等于另一个字节时

本文关键字:字节 另一个 加在一起 什么 | 更新日期: 2023-09-27 18:33:59

我正在编写一个修改二进制文件的C#程序。 在文件中有一个字节,用于存储有关一个人穿着的所有信息。

例:

1 = 帽子

2 = 鞋子

4 = 袜子

8 = 裤子

16 = 衬衫

32 = 眼镜

64 = 手表

128 = 耳环

莎莉穿着鞋子、裤子和衬衫 = 2 + 8 + 16 = 26。存储的字节为 26

弗雷德戴着帽子、鞋子、袜子、油漆、衬衫、眼镜和手表:1 + 2 + 4 + 8 + 16 + 32 + 64 = 127。存储的字节为 127

现在我想拿这个数字,弄清楚他们穿什么。一个人不能穿两件相同的东西,而且只有8种选择。

找出当什么字节加在一起等于另一个字节时

你有一点面具。

使用2 + 8 + 16 = 26示例,可以使用按位"and"运算符&提取每个位。 要检查此人是否穿鞋,请用 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;
}

使用具有 [Flags] 属性的枚举,然后使用 HasFlag 方法确定枚举的给定实例是否设置了该标志。

https://msdn.microsoft.com/en-us/library/system.enum.hasflag(v=vs.110).aspx

你可以使用这种技术。

引用你与莎莉的例子:

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

您可以使用按位运算符来解决这个问题。

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