битовые операции ( проверить бит)
- Войдите на сайт для отправки комментариев
Пт, 03/11/2017 - 00:54
имею шеснадцатиричное значение например '6F' мне нужно проверить в нем бит или группу битов, равны ли они единице или нет. как это реализовать по грамотному?
имею шеснадцатиричное значение например '6F' мне нужно проверить в нем бит или группу битов, равны ли они единице или нет. как это реализовать по грамотному?
Проверка N-ного бита:
if( value & (1 << N)) { // N bit is set }Проверка бит по маске - аналогично:
byte mask = 0x80; if(value & mask) { // each bit in mask is set in value variable }имею шеснадцатиричное значение ... как это реализовать по грамотному?
"По-грамотному" - не говорить "имею шеснадцатиричное значение", т.к. Вы его не имеете, а лишь представляете себе.
Так маску прикольней задавать:
Для отдельного бита Ардуиновцы придумали макрос bitRead(value, bit), но пользоваться им или нет - вопрос философский.
я пользуюсь таким кодом, вроде работает. Но вдруг есть косяки, проверьте.
byte A = 0x6F; int i=5; //например интересующий нас бит пятый (начинается с нуля) bool Bit = A&1<<i;// прочитать бит i из байта (переменная A) i от нуля до 7 начиная с правого бита // соответственно проверить бит: if (A&1<<i) {//если бит i равен 1 делаем одно } else {//иначе, если бит i равен 0 делаем другое } // операции изменения значения битов: A^=1<<i; // поменять состояние бита i на противоположное A|=1<<i; // присвоить биту i единицу A&=~(1<<i); // присвоить биту i нольПроверка N-ного бита:
if( value & (1 << N)) { // N bit is set }В глубинах ардуины определен макрос bit_is_set. Он собственно и раскрутится в то что Вы написали. Потому проще так.
if(bit_is_set(value,N)) {
Есть еще bitRead(value, N)
А я с вычитанием бита из байта не понял. Может быть не вычитание а вычленение?
вЫчитать, а не вычитАть. Типа считать бит из байта
исправил
Почему
Serial.print("!(~PORTD&(1 << PD4))=");Serial.println(!(~PORTD&(1 << PD4))); Serial.print("PORTD&(1 << PD4)=");Serial.println(PORTD&(1 << PD4)); Serial.print("bit_is_set(PORTD,4)=");Serial.println(bit_is_set(PORTD,4));вторая и третья строка выдает в ответ число 16 при лог единице на входе?
подаю ноль, потом единицу на PIND.4 Терминал:
p-a-h-a, вам нужно чётко различать логическое состояние бита и "вес" бита. Любой ненулевой вес это и есть логическая единица.
вторая и третья строка выдает в ответ число 16 при лог единице на входе?
Пин 4-ый, 24 = 16. Правильно выдаётся. А Вы чего хотели?
Как правильно получить единицу?
Ну есть 100500 способов. Например
Serial.print("PORTD&(1 << PD4)=");Serial.println((bool)(PORTD&(1 << PD4))); Serial.print("bit_is_set(PORTD,4)=");Serial.println((bool)bit_is_set(PORTD,4));или
Serial.print("PORTD&(1 << PD4)=");Serial.println(!!(PORTD&(1 << PD4))); Serial.print("bit_is_set(PORTD,4)=");Serial.println(!!bit_is_set(PORTD,4));Можно ещё с десяток вариантов набросать.
Только использование для чтения PORTx - не самое очевидное решение. Обычно используют PINx. Надеюсь, Вы знаете, что делаете.
Спасибо dimax, то о чем догадывался подтвердилось.
ЕвгенийП Спасибо за примеры. И да, совершенно верно, PIN. PORT из другой темы был взят. Я вообще был в поисках состояния бита регистра или переменной а наткнулся на тему с портом.
Всем привет. подскажите как Это правильно сделать в языке Си
ругань, видимо, секретная?
У вас кавычки в Printf не стандартные. Наверное копировали? Исправьте из вручную.