Java: проверка, если бит равен 0 или 1 в длинном
какой метод вы бы использовали, чтобы определить, является ли бит, представляющий 2^x, 1 или 0 ?
14 ответов
Я хотел бы использовать:
if ((value & (1L << x)) != 0)
{
// The bit was set
}
(возможно, Вам удастся уйти с меньшим количеством скобок, но я никогда не помню приоритет побитовых операций.)
интересно, если:
if (((value >>> x) & 1) != 0) {
}
.. лучше, потому что неважно, давно или нет, или его хуже, потому что это менее очевидно.
том Хотин-tackline 7 июля в 14: 16
вы также можете использовать
bool isSet = ((value>>x) & 1) != 0;
EDIT: разница между"(value>>x) & 1
" и "value & (1<<x)
"зависит от поведения, когда x больше размера типа "значение" (32 в вашем случае).
в этом конкретном случае с "(value>>x) & 1
"у вас будет знак значения, тогда как вы получите 0 с"value & (1<<x)
"(иногда полезно получить знак бита, если x слишком большой).
если вы предпочитаете иметь 0 в этом случае, вы можете использовать ">>>
" оператора, вместо этого, если ">>
"
Итак, "((value>>>x) & 1) != 0
" и "(value & (1<<x)) != 0
" полностью эквивалентна
на n
th LSB (наименее значимый бит), должно работать следующее:
boolean isSet = (value & (1 << n)) != 0;
вы можете проверить BitSet:http://java.sun.com/javase/6/docs/api/java/util/BitSet.html
в Java отлично работает следующее:
if (value << ~x < 0) {
// xth bit set
} else {
// xth bit not set
}
value
и x
может быть int
или long
(и не нужно быть таким же).
слово предостережения для не-Java программистов: предыдущее выражение работает на Java, потому что на этом языке операторы битового сдвига применяются только к 5 (или 6, в случае long
) самые низкие биты правого операнда. Это неявно переводит выражение в value << (~x & 31)
(или value << (~x & 63)
если value
is long
).
в JavaScript: он также работает в javascript (например, java, применяются только самые низкие 5 бит сдвига). В javascript любой number
32-битные.
в частности, в C отрицательный счетчик сдвига вызывает неопределенное поведение, поэтому этот тест не обязательно будет работать (хотя это может быть, в зависимости от вашей конкретной комбинации компилятора/процессора).
объявите temp int и сделайте его равным оригиналу. затем сдвиньте temp >> x раз, так что бит, который вы хотите проверить, находится в последней позиции. затем сделайте temp & 0xf, чтобы удалить предыдущие биты. Теперь осталось последнее. Наконец, сделайте if (y & 1 == 0), если последний бит равен 1, который должен равняться 0, иначе будет равен 1. Его либо это, либо если (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;
}
выход
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;
}
}
Если есть какие-то вопросы летают, просто напишите Мне по электронной почте.
Хорошее Программирования!
устранить bitshifting и его тонкости и использовать ЛТУ право and
операнд.