Java:检查长度是否为0或1
用什么方法来确定代表2 ^ x的位是1还是0?
我会使用:
if ((value & (1L << x)) != 0) { // The bit was set }
(你可以用更less的括号逃脱,但我从来不记得按位运算的优先级。)
另一种select:
if (BigInteger.valueOf(value).testBit(x)) { // ... }
我怀疑是否:
if (((value >>> x) & 1) != 0) { }
..是更好的,因为价值是否长期并不重要,或者如果它更糟,因为它不明显。
汤姆·霍金 – 7月7日14:16
你也可以使用
bool isSet = ((value>>x) & 1) != 0;
编辑:“ (value>>x) & 1
”和“ value & (1<<x)
”之间的差异依赖于当x大于“值”types的大小(在你的情况下是32) 。
在这个特殊的情况下,用“ (value>>x) & 1
”来表示有价值的符号,而用“ value & (1<<x)
”得到0(有时候得到位符号如果x太大)。
如果你喜欢在这种情况下有0,你可以使用“ >>>
”运算符,而不是“ >>
”
所以,“ ((value>>>x) & 1) != 0
”和“ (value & (1<<x)) != 0
”是完全等价的
你可能想看看BitSet: http : //java.sun.com/javase/6/docs/api/java/util/BitSet.html
对于第n
个LSB(最低有效位),以下应该工作:
boolean isSet = (value & (1 << n)) != 0;
向右移位 x并检查最低位。
2 ^ x位的值是“variables&(1 << x)”
在Java中,以下工作正常:
if (value << ~x < 0) { // xth bit set } else { // xth bit not set }
value
和x
可以是int
或long
(并且不需要是相同的)。
非Java程序员的注意事项 :前面的expression式适用于Java,因为在该语言中,位移运算符仅适用于右侧操作数的5位(或6位,如果是long
)最低位。 这隐式地将expression式转换为value << (~x & 31)
(或者如果value
很long
则value
value << (~x & 63)
)。
特别是在C中,负移位计数会调用未定义的行为,所以这个testing不一定会奏效(尽pipe它可能取决于你编译器/处理器的特定组合)。
声明一个临时int并使其等于原始值。 然后转换温度>> x次,所以你想检查的位是在最后的位置。 然后执行temp&0xf来删除前面的位。 现在留下最后一位。 最后如果(y&1 == 0),如果最后一位是1,应该等于0,否则将等于1.它或者如果(y + 0x1 == 0)…不太确定。 愚弄周围,看看
如果有人对位操作符不太熟悉,那么可以尝试下面的代码以编程方式决定它。 有两种方法。
1)使用java语言function来获取二进制格式string,然后在特定位置检查字符
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; }
产量
binaryFormat=1111101000 isBitSet(1000,1)false false isBitSet(1000,2)false false isBitSet(1000,3)false false isBitSet(1000,4)true true isBitSet(1000,5)false false isBitSet(1000,6)true true isBitSet(1000,7)true true isBitSet(1000,8)true true isBitSet(1000,9)true true
我的贡献 – 无视之前的一个
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 "); } } }
我编写了一些静态类,它正在做一些位操作的东西。
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; } }
如果有一些问题,请给我发电子邮件。
好编程!
消除偏移和错综复杂的问题,并为右侧and
操作数使用LUT 。