【问题标题】:Set specific bit in byte以字节为单位设置特定位
【发布时间】:2011-01-12 21:00:05
【问题描述】:

我正在尝试在 Java 字节变量中设置位。它确实提供了像.setBit(i) 这样的propper 方法。有谁知道我如何实现这一点?

我可以逐位迭代给定字节:

if( (my_byte & (1 << i)) == 0 ){

}

但是我不能将此位置设置为 1 或 0,可以吗?

【问题讨论】:

  • @phuclv 这是一个 C/C++ 问题,不是 Java 问题。
  • @MarkRotteveel 使用相同的语法。如果事实上标签应该重命名为类似 C 的东西
  • @phuclv 事实上它使用相同的语法 - 在我看来 - 不是关闭为重复的充分理由。

标签: java byte bit-manipulation


【解决方案1】:

使用按位 OR (|) 和 AND (&amp;) 运算符。设置位,即将pos处的位转为1

my_byte = my_byte | (1 << pos);   // longer version, or
my_byte |= 1 << pos;              // shorthand

取消设置,或将其转为0

my_byte = my_byte & ~(1 << pos);  // longer version, or
my_byte &= ~(1 << pos);           // shorthand

例如,见Advanced Java/Bitwise Operators

【讨论】:

  • 另见 xor 运算符——它是该武器库中的第三个强大工具(请参阅关于屏蔽的 Wikipedia 文章)。
  • 哇。这实际上是基本的计算机科学知识,但我还是很震惊,二进制世界太棒了
【解决方案2】:

设置一点:

myByte |= 1 << bit;

清除它:

myByte &= ~(1 << bit);

【讨论】:

  • 你是什么意思这会“设置”一点?假设您试图访问第 0 位,而 myByte 包含 11101101。这是什么意思?如何控制设置的值是什么?
  • @Michael:设置位意味着将其设为 1。清除位意味着将其设为 0。
【解决方案3】:

只是为了补充Jon‘s answerdriis‘ answer

稍微切换(反转)

    myByte ^= 1 << bit;

【讨论】:

  • @ernesto 但它没有具体回答这个问题。他问如何设置位,而不是切换它。它们是有区别的。当然,您可以先检查该位,然后根据需要切换它,但这也是两个独立的任务......
【解决方案4】:

请查看为您完成这项工作的 java.util.BitSet 类。

设置:myByte.set(bit); 重置:myByte.clear(bit); 用 bool 填充:myByte.set(bit, b); 获取布尔值:b = myByte.get(bit); 获取位图:byte bitMap = myByte.toByteArray()[0];

【讨论】:

  • 小心使用 bitset。将位设置为 0 和将其清除之间没有区别,因此 length() 不会计算那些设置为 0 的位
【解决方案5】:

您需要的技术是隔离所选位并设置或清除它。您已经有了隔离位的表达式,因为您在上面使用它来测试它。您可以通过 ORing 来设置该位,或通过按位与该位的 1 的补码来清除该位。

boolean setBit;
my_byte = setBit
          ? myByte | (1 << i)
          : myByte & ~(1 << i);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2011-11-08
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多