14 ответов:
Я хотел бы использовать:
if ((value & (1L << x)) != 0) { // The bit was set }(возможно, Вам удастся уйти с меньшим количеством скобок, но я никогда не помню приоритет побитовых операций.)
интересно, если:
if (((value >>> x) & 1) != 0) { }.. лучше, потому что неважно, давно или нет, или его хуже, потому что это менее очевидно.
Tom Hawtin-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" полностью эквивалентна
на
nth LSB (наименее значимый бит), должно работать следующее:boolean isSet = (value & (1 << n)) != 0;
вы можете проверить BitSet:http://java.sun.com/javase/6/docs/api/java/util/BitSet.html
сдвиг битов справа на x и проверка самого нижнего бита.
в 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)еслиvalueislong).Javascript: он также работает в javascript (например, java, применяются только самые низкие 5 бит числа сдвигов). В javascript любой
number32-битные.в частности, в C отрицательное число сдвигов вызывает неопределенное поведение, поэтому этот тест не обязательно будет работать (хотя это может зависеть от вашей конкретной комбинации компилятора/процессора).
объявите temp int и сделайте его равным оригиналу. затем сдвиньте temp > > x раз, так что бит, который вы хотите проверить, находится в последней позиции. затем сделайте temp & 0xf, чтобы удалить предыдущие биты. Теперь осталось с последним битом. Наконец, сделайте, если (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; } }Если есть какие-то вопросы летают, просто напишите Мне по электронной почте.
Хорошее Программирования!
устраните битшифтинг и его тонкости и используйте LUT право
andоперанд.
Comments