Java:检查长序列中的位是0还是1

Java:检查长序列中的位是0还是1,java,long-integer,bit-shift,Java,Long Integer,Bit Shift,您将使用什么方法来确定表示2^x的位是1还是0?我将使用: if ((value & (1L << x)) != 0) { // The bit was set } 如果(nth LSB(最低有效位)的(值和(1L),则以下各项应起作用: boolean isSet = (value & (1 << n)) != 0; boolean isSet=(value&(12^x位的值是“variable&(1按x右键),并检查最低位。您也可以使用 bo

您将使用什么方法来确定表示2^x的位是1还是0?

我将使用:

if ((value & (1L << x)) != 0)
{
   // The bit was set
}

如果(
n
th LSB(最低有效位)的(值和(1L),则以下各项应起作用:

boolean isSet = (value & (1 << n)) != 0;

boolean isSet=(value&(12^x位的值是“variable&(1按x右键),并检查最低位。

您也可以使用

bool isSet = ((value>>x) & 1) != 0;
编辑:“
(value>>x)&1
”和“
value&(1>x)&1
”之间的差异将带有值的符号,而如果“
>
”运算符,则会得到一个0

因此,“
((值>>>x)和1)!=0
”和“
(值和(1另一种选择:

if (BigInteger.valueOf(value).testBit(x)) {
    // ...
}

我想知道:

  if (((value >>> x) & 1) != 0) {

  }
。更好是因为它不在乎值是否长,或者更糟是因为它不太明显。


Tom Hawtin-于7月7日14:16开始执行任务。

您可能需要检查位集:

消除位移位及其复杂性,并将a用于右
操作数。

我的贡献-忽略上一个

public class TestBits { 

    public static void main(String[] args) { 

        byte bit1 = 0b00000001;     
        byte bit2 = 0b00000010;
        byte bit3 = 0b00000100;
        byte bit4 = 0b00001000;
        byte bit5 = 0b00010000;
        byte bit6 = 0b00100000;
        byte bit7 = 0b01000000;

        byte myValue = 9;                        // any value

        if (((myValue >>> 3) & bit1 ) != 0) {    //  shift 3 to test bit4
            System.out.println(" ON "); 
        }
    } 
}

声明一个temp int并使其等于原始值。
然后将temp>>x次移位,使您要检查的位位于最后一个位置。然后执行temp&0xf以删除前面的位。现在保留最后一位。最后执行if(y&1==0),如果最后一位是1,则应等于0,否则将等于1。是那样还是if(y+0x1==0)…不太确定。随便看看,如果有人对按位运算符不太熟悉,那么可以尝试下面的代码以编程方式确定它。有两种方法

1) 使用java语言功能获取二进制格式字符串,然后检查特定位置的字符

2) 继续除以2,并确定特定位置的位值

public static void main(String[] args) {
    Integer n =1000;
    String binaryFormat =  Integer.toString(n, 2);
    int binaryFormatLength = binaryFormat.length();
    System.out.println("binaryFormat="+binaryFormat);
    for(int i = 1;i<10;i++){
        System.out.println("isBitSet("+n+","+i+")"+isBitSet(n,i));
        System.out.println((binaryFormatLength>=i && binaryFormat.charAt(binaryFormatLength-i)=='1'));
    }

}

public static boolean isBitSet(int number, int position){
    int currPos =1;
    int temp = number;
    while(number!=0 && currPos<= position){
        if(temp%2 == 1 && currPos == position)
            return true;
        else{
            temp = temp/2;
            currPos ++;
        }
    }
    return false;
}

我编写了一个小的静态类,它正在执行一些位操作

public final class Bitfield {

  private Bitfield() {}

  // ********************************************************************
  // * TEST
  // ********************************************************************

  public static boolean testBit(final int pos, final int bitfield) {
      return (bitfield & (1 << pos)) == (1 << pos);
  }

  public static boolean testNum(final int num, final int bitfield) {
      return (bitfield & num) == num;
  }

  // ********************************************************************
  // * SET
  // ********************************************************************

  public static int setBit(final int pos, final int bitfield) {
     return bitfield | (1 << pos);
  }

  public static int addNum(final int number, final int bitfield) {
      return bitfield | number;
  }

  // ********************************************************************
  // * CLEAR
  // ********************************************************************

  public static int clearBit(final int pos, final int bitfield) {
      return bitfield ^ (1 << pos);
  }

  public static int clearNum(final int num, final int bitfield) {
      return bitfield ^ num;
  }

  }
公共最终类位字段{
专用位字段(){}
// ********************************************************************
//*测试
// ********************************************************************
公共静态布尔测试位(最终整型位置,最终整型位字段){

return(位域&(1)在Java中,以下功能正常:

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

if(取决于语言的值。在java中这不是真的。应该是1L,或者(1@ThibThib)没什么奇怪的。请不要发布愚蠢的反java火焰诱饵。我想知道((值>>>x)&1)!=0更好,因为它不在乎值是否长,也不在乎它是否更差,因为它不太明显。@ArtOfWarfare:我有时将
==
误输入为
=
-这会导致一个有效的表达式指定该值,这不是我想要的。在Java中,这是非法的(假设它不是
布尔变量)。按位运算符是Java的一部分,这在我看来是件好事。有很多情况下需要按位运算符。没有必要将其与
while
if
等中的条件表达式的类型是否应为
布尔值混为一谈,我认为应该是。这应该是1L,或者(1正如马特·凯恩在相同的解决方案中所说:应该是1L,或者(1我认为这样更好,因为出错的可能性更小——如果你认为不明显,你可以将测试提取到一个适当命名的函数中(布尔isBitSet(long value,int x)等等)如果要经常调用此代码,则这不是一个很好的解决方案。您将用单行替代方案替换单行替代方案,并且位移位实际上并没有那么困难。行的长度!=行的可读性,wds。您可能认为前面的解决方案更有效,但差异可能很小,特别是如果testBit()内联。需要注意的是,此解决方案分配内存,效率远低于按位运算符。是的,这通常并不重要,但有时避免不必要的GC和/或低效代码(Android应用程序、游戏主循环等)很重要。资源浪费。如果你不信任“未来的维护者”对于理解位操作,你会遇到比项目人力资源更大的问题。位操作不是魔法。这是程序员基本技能的一部分。@dolmen,如果探查器强调它占用大量CPU时间,我会用更快的东西来代替它。在那之前,这并不重要。你为什么发布它一个复杂的、难以理解的、不确定的答案,在现有答案上没有50+的向上投票?这比按位运算慢得多。它需要在1或2个时钟周期的按位运算中查找地址。一次除法的CPU时间比一次位运算多大约100倍。而且你可以迭代地进行。这个“解决方案”是关于性能的BigInteger级别。
if (value << ~x < 0) {
   // xth bit set
} else {
   // xth bit not set
}