c# - 找出加在一起时哪些字节等于另一个字节

标签 c#

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

示例:

1 = 帽子

2 = 鞋子

4 = socks

8 = 裤子

16 = 衬衫

32 = 眼镜

64 = 观看

128 = 耳环

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

Fred 戴着帽子、鞋子、 socks 、油漆、衬衫、眼镜和 watch :1 + 2 + 4 + 8 + 16 + 32 + 64 = 127。存储的字节是127

现在我想用那个号码弄清楚他们穿的是什么。一个人不能穿两件相同的东西,只有这 8 种选择。

最佳答案

你有一个 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;
}

关于c# - 找出加在一起时哪些字节等于另一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35302570/

相关文章:

c# - 如何使用 LINQ 查找包含 2 个逗号分隔字符串的匹配项

c# - 如何使用 ASP.NET MVC 进行 HTTP 调用?

c# - 远程处理与套接字

c# - 试图更好地理解 'using' 语句

c# dll microsoft dll 异常

c# - 通过索引设置treeview.SelectedNode (List<Int>)

c# - 我可以将 RangeSlider(来自 WPF 扩展工具包)绑定(bind)到 ObservableCollection 的日期时间属性吗?

c# - 通过C#将创建过程命令上传到mysql时忽略@symbol

c# - 将 MMDDYYYY 转换为 01-JAN-YY

c# - AutoFixture 无法创建声明(使用 .NET Framework 4.6)