【问题标题】:How to get the value of a bit at a certain position from a byte?如何从字节中获取某个位置的位值?
【发布时间】:2012-03-10 10:09:54
【问题描述】:

如果我有一个字节,该方法如何在某个位置检索位?

这是我所知道的,但我认为它不起作用。

public byte getBit(int position) {
    return (byte) (ID >> (position - 1));
}

ID 是我从中检索信息的字节的名称。

【问题讨论】:

标签: java byte bit


【解决方案1】:

您想制作一个位掩码并按位与。这最终看起来与您所拥有的非常接近 - 使用 shift 设置适当的位,使用 & 进行按位运算。

所以

 return ((byte)ID) & (0x01 << pos) ;

其中pos 必须介于 0 和 7 之间。如果您的最低有效位为“位 1”,那么您需要您的 -1,但我建议您不要这样做——这种位置变化是对我来说总是错误的来源。

【讨论】:

    【解决方案2】:
    public byte getBit(int position)
    {
       return (ID >> position) & 1;
    }
    

    按位置右移 ID 将使#position 位在数字中最右侧的位置。将其与按位 AND &amp; 与 1 相结合将告诉您该位是否已设置。

    position = 2
    ID = 5 = 0000 0101 (in binary)
    ID >> position = 0000 0001
    
    0000 0001 & 0000 0001( 1 in binary ) = 1, because the furthest right bit is set.
    

    【讨论】:

    • 其实就是按位与;逻辑和是 &&。
    • 这个答案有点误导,因为括号。 >> 的优先级高于 &(至少在 Java 中)。
    • 我认为括号实际上使这段代码更清晰,并不是每个人都记住了优先表。
    【解决方案3】:

    获取整数的第 n 位

     return ((num >> (n-1)) & 1);
    

    【讨论】:

      【解决方案4】:

      在 Java 中,以下工作正常:

      if (value << ~x < 0) {
         // xth bit set
      } else {
         // xth bit not set
      }
      

      valuex 可以是 intlong(不必相同)。

      非 Java 程序员注意事项:前面的表达式在 Java 中有效,因为在该语言中,位移运算符仅适用于最低的 5(或 6,如果是 long)右侧操作数的位。这会将表达式隐式转换为value &lt;&lt; (~x &amp; 31)(或value &lt;&lt; (~x &amp; 63),如果valuelong)。

      Javascript:它也适用于 javascript(与 java 一样,仅应用了移位计数的最低 5 位)。在 javascript 中,任何 number 都是 32 位的。

      特别是在 C 语言中,负移位计数会调用未定义的行为,因此该测试不一定有效(尽管它可能有效,具体取决于您的编译器/处理器的特定组合)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-04
        • 2013-02-21
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多