【问题标题】:How to solve this bit operation?如何解决这个位操作?
【发布时间】:2011-01-28 08:56:25
【问题描述】:

我有一个字节,我需要替换最后(最不重要的)位。 下面的例子。

Original byte:      xxxx0110
Replacement byte:       1111
What I want to get: xxxx1111

Original byte:      xxxx1111
Replacement byte:       0000
What I want to get: xxxx0000

Original byte:      xxxx0000
Replacement byte:       1111
What I want to get: xxxx1111

Original byte:      xxxx1010
Replacement byte:       1111
What I want to get: xxxx1111

Original byte:      xxxx0101
Replacement byte:       0111
What I want to get: xxxx0111

【问题讨论】:

  • 你有一个替代品 :)。
  • 像往常一样:你已经尝试了什么?
  • 值 = (原始 & 240) | (替换 & 15) ?

标签: c# .net logic bit-manipulation


【解决方案1】:
 value = (byte)( (value & ~15) | newByte);

~15 为所有除了最后 4 位创建掩码; value & {that mask} 取走最后 4 位,然后 | newByte 将新数据中的位放在原位。

【讨论】:

  • 在什么场景下? newBytefull 值是多少?在示例数据中您只显示 4 位,所以我的 假设 是其他为 0。如果不是,只需将 newByte 替换为 (newByte & 15)
【解决方案2】:

这可以通过按位与来清除位和按位或来设置位的组合来完成。

要清除最低四位,您可以与除那些位为零的位之外的所有位置都为 1 的值。像这样的一个值是~0xF,它是0xF 的补码,它是四个1:0b1111

要设置位,您可以对要设置的位使用按位或。自 0 OR x = x 以来,这将按您的意愿工作。

最终结果是

(x & ~0xF) | bits

编辑:根据 Eamon Nerbonne 的评论,您应该然后将其转换回 byte

(byte)((x & ~0xF) | bits)

【讨论】:

  • +1,但请注意 C# 中的位运算符隐式转换为 int - 为避免混淆,您可能应该像 Marc 那样转换整个表达式。
  • @Eamon Nerbonne- 感谢您指出这一点!我不是一个 C# 程序员,能得到这样的反馈是件好事。原来的帖子应该是固定的。
【解决方案3】:

如果我的理解是正确的,您希望将您的字节(左移 4 次后)与替换字节(也左移 4 次)进行 OR。然后右移 4 次,你会得到想要的结果。

例如:a = 1001 1101 替换字节:0000 1011

左移 4 次:1101 0000 左移替换4次:1011 0000

OR 结果:1111

右移 4 次:1011(最终结果)。

也许这个链接有帮助:http://www.codeproject.com/KB/cs/leftrightshift.aspx

【讨论】:

    【解决方案4】:

    trim 最后 4 位。和append 新的。

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 2022-11-04
      • 2021-12-25
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 2023-04-06
      • 2018-04-24
      • 2014-11-10
      相关资源
      最近更新 更多