int temp = 0x5E; // in binary 0b1011110.
Есть ли способ проверить, равен ли бит 3 в temp 1 или 0 без сдвига бит и маскирования.
Просто хочу знать, есть ли для этого какая-то встроенная функция, или я вынужден написать ее сам.
Ответы:
В C, если вы хотите скрыть манипуляции с битами, вы можете написать макрос:
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
и используйте его таким образом, чтобы проверить n- й бит с правого конца:
CHECK_BIT(temp, n - 1)
В C ++ вы можете использовать std :: bitset .
!= 0
верно, так зачем? 1
точно так же верно, как 0.1415
!
Проверьте, установлен ли бит N (начиная с 0):
temp & (1 << N)
Для этого нет встроенной функции.
1 << 0
?? Простите, запуталась.
1<<0
1 без какой-либо смены (смена 0), то есть1<<0 == 1
Я бы просто использовал std :: bitset, если это C ++. Просто. Прямолинейно. Никаких шансов на глупые ошибки.
typedef std::bitset<sizeof(int)> IntBits;
bool is_set = IntBits(value).test(position);
или как насчет этой глупости
template<unsigned int Exp>
struct pow_2 {
static const unsigned int value = 2 * pow_2<Exp-1>::value;
};
template<>
struct pow_2<0> {
static const unsigned int value = 1;
};
template<unsigned int Pos>
bool is_bit_set(unsigned int value)
{
return (value & pow_2<Pos>::value) != 0;
}
bool result = is_bit_set<2>(value);
std::bitset<CHAR_BIT * sizeof(int)>
если быть еще более правильным
Да, я знаю, что мне «не нужно» делать это таким образом. Но я обычно пишу:
/* Return type (8/16/32/64 int size) is specified by argument size. */
template<class TYPE> inline TYPE BIT(const TYPE & x)
{ return TYPE(1) << x; }
template<class TYPE> inline bool IsBitSet(const TYPE & x, const TYPE & y)
{ return 0 != (x & y); }
Например:
IsBitSet( foo, BIT(3) | BIT(6) ); // Checks if Bit 3 OR 6 is set.
Помимо прочего, этот подход:
На самом деле выбранный ответ неверен. Приведенная ниже функция вернет битовую позицию или 0 в зависимости от того, действительно ли бит включен. Это не то, о чем просил плакат.
#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
Вот что изначально искал плакат. Приведенная ниже функция вернет либо 1, либо 0, если бит включен, а не позицию.
#define CHECK_BIT(var,pos) (((var)>>(pos)) & 1)
bool has_feature = CHECK_BIT(register, 25);
хорошо знать, что я могу сделать это без двойного отрицания.
Согласно этому описанию битовых полей , существует метод прямого определения полей и доступа к ним. Пример в этой записи:
struct preferences {
unsigned int likes_ice_cream : 1;
unsigned int plays_golf : 1;
unsigned int watches_tv : 1;
unsigned int reads_books : 1;
};
struct preferences fred;
fred.likes_ice_cream = 1;
fred.plays_golf = 1;
fred.watches_tv = 1;
fred.reads_books = 0;
if (fred.likes_ice_cream == 1)
/* ... */
Также там есть предупреждение:
Однако битовые члены в структурах имеют практические недостатки. Во-первых, порядок битов в памяти зависит от архитектуры, а правила заполнения памяти варьируются от компилятора к компилятору. Кроме того, многие популярные компиляторы генерируют неэффективный код для чтения и записи битовых элементов, и существуют потенциально серьезные проблемы безопасности потоков, связанные с битовыми полями (особенно в многопроцессорных системах) из-за того, что большинство машин не могут манипулировать произвольными наборами битов в памяти, но вместо этого должен загружать и хранить целые слова.
Вы можете использовать Bitset - http://www.cppreference.com/wiki/stl/bitset/start .
Используйте std :: bitset
#include <bitset>
#include <iostream>
int main()
{
int temp = 0x5E;
std::bitset<sizeof(int)*CHAR_BITS> bits(temp);
// 0 -> bit 1
// 2 -> bit 3
std::cout << bits[2] << std::endl;
}
temp
нужно отражать, чтобы сделать его "прямым порядком"?
Есть, а именно внутренняя инструкция _bittest .
Я использую это:
#define CHECK_BIT(var,pos) ( (((var) & (pos)) > 0 ) ? (1) : (0) )
где "pos" определяется как 2 ^ n (например, 1,2,4,8,16,32 ...)
Возвращает: 1, если истина 0, если ложь
4 = 2^(3-1)
для битовой позиции 3, поскольку это было частью вопроса.
Я пытался прочитать 32-битное целое число, которое определяло флаги для объекта в PDF-файлах, и это не сработало для меня
что исправлено, это изменяло определение:
#define CHECK_BIT(var,pos) ((var & (1 << pos)) == (1 << pos))
операнд & возвращает целое число с флагами, которые оба имеют в 1, и он неправильно переводился в логическое значение, это помогло
!= 0
сделал бы то же самое. Не знаю, чем могут отличаться сгенерированные машинные инструкции.
Вы можете «имитировать» сдвиг и маскировку: if ((0x5e / (2 * 2 * 2))% 2) ...
Почему бы не использовать такую простую вещь?
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
std::cout << (((status & (1 << i)) ? '1' : '0');
. Вам следует использовать CHAR_BIT
константу из <climits>
вместо жесткого кодирования 8 бит, хотя в этом случае вы знаете, что результат в любом случае будет 8, поскольку вы используетеuint8_t
#define CHECK_BIT(var,pos) ((var>>pos) & 1)
pos - установка битовой позиции с 0.
возвращает 0 или 1.
если вам просто нужен настоящий жестко запрограммированный способ:
#define IS_BIT3_SET(var) ( ((var) & 0x04) == 0x04 )
обратите внимание, что этот hw зависит и предполагает, что этот порядок битов 7654 3210, а var - 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
Хотя сейчас уже довольно поздно отвечать, есть простой способ узнать, установлен ли N-й бит или нет, просто используя математические операторы POWER и MODULUS.
Допустим, мы хотим знать, установлен ли у 'temp' N-й бит или нет. Следующее логическое выражение вернет истину, если бит установлен, в противном случае - 0.
Рассмотрим следующий пример:
Если я хочу знать, установлен ли 3-й бит или нет, я получаю
Таким образом, выражение возвращает истину, указывая на то, что установлен третий бит.
Один из подходов - проверка при следующих условиях:
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
Я делаю это:
LATGbits.LATG0 = ((m & 0x8)> 0); // чтобы проверить, равен ли бит-2 m 1