Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Битовые операции


Автор: zzmeyz 20.3.2006, 12:25
Немного не по теме: можно ли в яве производить проверку определенных битов, с последующим их изменением. И вообще как записать байт побитово?

Автор: batigoal 20.3.2006, 12:46
Существует класс BitSet. Вот тут есть пример:

http://javaalmanac.com/egs/java.util/Bits.html

плюс можно просто сделать сложение по известной тебе маске.

Автор: Ignat 20.3.2006, 13:04
Lamer George, у меня просто из чистого любопытства вопрос возник...
Зачем пользоваться битсетами, тем более использовать чей-то класс, когда (ИМХО!) проще стандартными bitwise operators.
Вроде a&1<<c.

Зы. с Явой не работаю =)

Автор: batigoal 20.3.2006, 13:36
Цитата(Ignat @ 20.3.2006, 14:04 Найти цитируемый пост)
Зачем пользоваться битсетами, тем более использовать чей-то класс, когда (ИМХО!) проще стандартными bitwise operators.

Потому что за объектной оринетриованностью я совсем забыл об обычных битовых оперторах smile


zzmeyz, о них есть тут: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/bitwise.html
А разница, видимо, в том, что в случае BitSet можно работать с битовой последовательностью любой длины.


Ignat, спасибо за поправку.

Автор: Ignat 20.3.2006, 13:46
Цитата(Lamer George @ 20.3.2006, 13:36 Найти цитируемый пост)
что в случае BitSet можно работать с битовой последовательностью любой длины

Честно говоря, вспомнил только один случай в своей практике, когда потребовалась произвольная длина, обычно 5-6 флажков.
Но работать с битами очень люблю.

Зы. Да это не поправка была, просто интерес... Вдруг к побитовым операциям Ява требует ОО подход smile

Автор: chief39 20.3.2006, 16:04
Заполнение массива байт(в данном кусочке переменная типа инт сохраняется в 4 байта в BigEndian порядке). Нужный байт сдвигается в самый низ и впихивается в байт. Автоматически всё лишнее обрезается.
Код

        //бла-бла-бла
        pack[8] = (byte)(unix_secs>>>24);
        pack[9] = (byte)(unix_secs>>>16);
        pack[10] = (byte)(unix_secs>>>8);
        pack[11] = (byte)(unix_secs);
        //бла-бла-бла


Если надо считать нужный бит - накладывай маску(&) где все ноли и лишь нужный бит - единичка. Если нужный бит - ноль, то весь результат будет равен 0.
Или сдвигать как в предыдущем примере нужный бит вниз и считывать всегда самый нижний.
Записывать - всю маску - в нолики, а нужный бит в 0 или 1(смотря что надо). И выполняешь "или" ( | ). Все биты будут такими как были, а нужный станет таким, как ты в маске его указал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)