找出当什么字节加在一起等于另一个字节时
本文关键字:字节 另一个 加在一起 什么 | 更新日期: 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);