C / C ++ проверяет, установлен ли один бит, то есть переменная int - PullRequest
91 голосов
/ 07 февраля 2009
int temp = 0x5E; // in binary 0b1011110.

Есть ли такой способ проверить, равен ли бит 3 в темпе 1 или 0 без смещения и маскирования битов.

Просто хочу узнать, есть ли какая-то встроенная функция для этого, или я вынужден написать ее сам.

Ответы [ 18 ]

3 голосов
/ 15 мая 2012

Я пытался прочитать 32-разрядное целое число, которое определило флаги для объекта в PDF, и это не сработало для меня

что исправило это изменение определения:

#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))

операнд & возвращает целое число с флагами, которые оба имеют в 1, и оно не было приведено должным образом к логическому значению, это сделало трюк

2 голосов
/ 07 февраля 2009

Вы можете «смоделировать» смещение и маскировку: if ((0x5e / (2 * 2 * 2))% 2) ...

2 голосов
/ 09 февраля 2009

Для решения низкого уровня для x86 используйте код операции x86 TEST .

Ваш компилятор должен превратить _bittest в это, хотя ...

1 голос
/ 15 октября 2013

Почему бы не использовать что-то простое?

uint8_t status = 255;
cout << "binary: ";

for (int i=((sizeof(status)*8)-1); i>-1; i--)
{
  if ((status & (1 << i)))
  {
    cout << "1";
  } 
  else
  {
    cout << "0";
  }
}

ВЫХОД: двоичный файл: 11111111

0 голосов
/ 25 мая 2017

Один подход будет проверять в следующих условиях:

if ( (mask >> bit ) & 1)

Программа объяснения будет:

#include <stdio.h>

unsigned int bitCheck(unsigned int mask, int pin);

int main(void){
   unsigned int mask = 6;  // 6 = 0110
   int pin0 = 0;
   int pin1 = 1;
   int pin2 = 2;
   int pin3 = 3;
   unsigned int bit0= bitCheck( mask, pin0);
   unsigned int bit1= bitCheck( mask, pin1);
   unsigned int bit2= bitCheck( mask, pin2);
   unsigned int bit3= bitCheck( mask, pin3);

   printf("Mask = %d ==>>  0110\n", mask);

   if ( bit0 == 1 ){
      printf("Pin %d is Set\n", pin0);
   }else{
      printf("Pin %d is not Set\n", pin0);
   }

    if ( bit1 == 1 ){
      printf("Pin %d is Set\n", pin1);
   }else{
      printf("Pin %d is not Set\n", pin1);
   }

   if ( bit2 == 1 ){
      printf("Pin %d is Set\n", pin2);
   }else{
      printf("Pin %d is not Set\n", pin2);
   }

   if ( bit3 == 1 ){
      printf("Pin %d is Set\n", pin3);
   }else{
      printf("Pin %d is not Set\n", pin3);
   }
}

unsigned int bitCheck(unsigned int mask, int bit){
   if ( (mask >> bit ) & 1){
      return 1;
   }else{
      return 0;
   }
}

Выход:

Mask = 6 ==>>  0110
Pin 0 is not Set
Pin 1 is Set
Pin 2 is Set
Pin 3 is not Set
0 голосов
/ 10 июля 2013

Сейчас уже довольно поздно отвечать, но есть простой способ узнать, установлен N-й бит или нет, просто используя математические операторы POWER и MODULUS.

Скажем, мы хотим знать, установлен ли «temp» N-й бит или нет. Следующее логическое выражение выдаст true, если бит установлен, 0 в противном случае.

  • (временная температура 2 ^ N + 1> = 2 ^ N)

Рассмотрим следующий пример:

  • int temp = 0x5E; // в двоичном виде 0b1011110 // BIT 0 равен LSB

Если я хочу знать, установлен 3-й бит или нет, я получаю

  • (94 МОДУЛЯ 16) = 14> 2 ^ 3

Таким образом, выражение возвращает true, указывая, что установлен 3-й бит.

0 голосов
/ 23 ноября 2010

самый быстрый способ - это таблица поиска масок

0 голосов
/ 07 февраля 2009

, если вы просто хотите по-настоящему жестко закодированный способ:

 #define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )

обратите внимание, что это зависит от hw и принимает этот битовый порядок 7654 3210, а переменная равна 8 бит.

#include "stdafx.h"
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
int _tmain(int argc, _TCHAR* argv[])
{
    int temp =0x5E;
    printf(" %d \n", IS_BIT3_SET(temp));
    temp = 0x00;
    printf(" %d \n", IS_BIT3_SET(temp));
    temp = 0x04;
    printf(" %d \n", IS_BIT3_SET(temp));
    temp = 0xfb;
    printf(" %d \n", IS_BIT3_SET(temp));
    scanf("waitng %d",&temp);

    return 0;
}

Результат:

1 0 1 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...