битовые операции ( проверить бит)

SadiQ228
Offline
Зарегистрирован: 10.04.2017

имею шеснадцатиричное значение например '6F'  мне нужно проверить в нем бит или группу битов, равны ли они единице или нет. как это реализовать по грамотному?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

SadiQ228 пишет:

имею шеснадцатиричное значение например '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
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SadiQ228 пишет:

имею шеснадцатиричное значение ... как это реализовать по грамотному?

"По-грамотному" - не говорить "имею шеснадцатиричное значение", т.к. Вы его не имеете, а лишь представляете себе.

sadman41
Offline
Зарегистрирован: 19.10.2016

Так маску прикольней задавать:

byte mask = B10010110;

Для отдельного бита Ардуиновцы придумали макрос bitRead(value, bit), но пользоваться им или нет - вопрос философский.

MaksVV
Offline
Зарегистрирован: 06.08.2015

я пользуюсь таким кодом, вроде работает. Но вдруг есть косяки, проверьте. 

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 ноль 


       

 

Logik
Offline
Зарегистрирован: 05.08.2014

DIYMan пишет:

Проверка N-ного бита:

if( value & (1 << N)) {
 // N bit is set
}

В глубинах ардуины определен макрос bit_is_set. Он собственно и раскрутится в то что Вы написали. Потому проще так.

 

if(bit_is_set(value,N)) {

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Есть еще bitRead(value, N)

nik182
Offline
Зарегистрирован: 04.05.2015

А я с вычитанием бита из байта не понял. Может быть не вычитание а вычленение?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

вЫчитать, а не вычитАть. Типа считать бит из байта

MaksVV
Offline
Зарегистрирован: 06.08.2015

nik182 пишет:
А я с вычитанием бита из байта не понял. Может быть не вычитание а вычленение?

исправил

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

Почему

 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 Терминал:

!(~PORTD&(1 << PD4))=0
PORTD&(1 << PD4)=0
bit_is_set(PORTD,4)=0
!(~PORTD&(1 << PD4))=1
PORTD&(1 << PD4)=16
bit_is_set(PORTD,4)16
Как правильно получить единицу? Первую строку получил методом тыка и гугления.
 
 
 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

p-a-h-a, вам нужно чётко различать логическое состояние бита  и "вес" бита. Любой ненулевой вес это и есть логическая единица.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

p-a-h-a пишет:

вторая и третья строка выдает в ответ число 16 при лог единице на входе?

Пин 4-ый, 24 = 16. Правильно выдаётся.  А Вы чего хотели?

p-a-h-a пишет:

Как правильно получить единицу?

Ну есть 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. Надеюсь, Вы знаете, что делаете.

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

Спасибо dimax, то о чем догадывался подтвердилось.  

ЕвгенийП Спасибо за примеры. И да, совершенно верно, PIN. PORT из другой темы был взят. Я вообще был в поисках состояния бита регистра или переменной а наткнулся на тему с портом.

Guardlan_of_Darkness
Offline
Зарегистрирован: 26.02.2022

Всем привет. подскажите как Это правильно сделать в языке Си

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()         // Главная функция
{
  unsigned char a = 0x94;
  if(a & 0x08 > 1)
  {//если бит i равен 1 делаем одно
          }
  else {//иначе, если бит i равен 0 делаем другое
       }
  Printf(“truth”)
  }
запускаю, в консоли ругани в два раза больше....
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ругань, видимо, секретная?

Guardlan_of_Darkness
Offline
Зарегистрирован: 26.02.2022
 make -s
main.c:13:10: error: non-ASCII characters are not allowed outside of literals and identifiers
  Printf(“truth”)
         ^
main.c:13:18: error: non-ASCII characters are not allowed outside of literals and identifiers
  Printf(“truth”)
               ^
main.c:13:22: error: expected ';' after expression
  Printf(“truth”)
                 ^
                 ;
main.c:13:13: error: use of undeclared identifier 'truth'
  Printf(“truth”)
          ^
4 errors generated.
make: *** [<builtin>: main.o] Error 1
exit status 2
 
Upper
Offline
Зарегистрирован: 23.06.2020

У вас кавычки в Printf не стандартные. Наверное копировали? Исправьте из вручную.