【问题标题】:Combine two mutually exclusive byte arrays into one将两个互斥字节数组合二为一
【发布时间】:2016-08-31 09:25:17
【问题描述】:

我有 2 个字节数组,每个数组 5 个字节。每个字节数组代表 40 个标志,我需要将两个数组组合成一个 5 字节数组。每个字节数组都是互斥的,这有帮助,尽管我更愿意验证它们是互斥的。

所以我的问题是,如何将两个互斥的字节数组合并为一个。

我能想到的唯一方法是在两个数组之间进行位移并比较每个值,但必须有一种更简单的方法。有人可以帮忙吗?

【问题讨论】:

  • 不清楚您在这里所说的“互斥”是什么意思,或者您的输入和预期输出是什么。 minimal reproducible example真的帮助澄清你想要实现的目标。
  • @JonSkeet:我认为在一个中设置的位不应该在另一个中设置。虽然可能最好等待 OP 的确认。 :)
  • @Chris:确实。虽然这建议只使用|,而不需要任何转移。基本上,这个问题目前还不清楚,无法回答……
  • | 合并,a&b==0 验证排他性
  • @Keithin8a:您对 字节 使用了“互斥”一词——直到问题结束时您才提到位。两个字节互斥是没有意义的——而两个字节具有一组互斥的“on”位更有意义。是的,|(有演员表)听起来正是你想要的。

标签: c# arrays bit-shift bits


【解决方案1】:

要将一个字节中的位与另一个字节中的位组合,您可以使用按位或运算符|。如果在第一个或第二个字节中设置了该位,则此运算符将在结果字节中设置该位。

例子:

byte b1 = 0x12; // 0001 0010
byte b2 = 0x81; // 1000 0001
byte result = (byte)(b1 | b2); // Results in 0x93 = 1001 0011

合并两个数组:

byte[] flags1 = ...;
byte[] flags2 = ...;
byte[] result = new byte[5];
for(int i = 0; i < 5; i++)
    result[i] = (byte)(flags[i] | flags[2]);

使用按位与运算符&amp;,您可以找出两个字节中是否设置了任何位。示例:

byte b1 = 0x93; // 1001 0011
byte b2 = 0x1A; // 0001 1010
byte result = (byte)(b1 & b2); // Results in 0x12 = 0001 0010

检查两个数组中是否未设置位:

byte[] flags1 = ...;
byte[] flags2 = ...;
for(int i = 0; i < 5; i++)
    if ((byte)(flags[i] & flags[2]) != 0)
        throw new InvalidOperationException("Flags cannot be set in both arrays.");

【讨论】:

  • 您需要转换 - flags[i] | flags[2] 的结果是 int,而不是 byte。 (我想你的意思是flags1[i] | flags2[i]。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2021-12-13
  • 2013-07-05
  • 2017-06-23
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多