int temp = 0x5E; // in binary 0b1011110.
Есть ли способ проверить, равен ли бит 3 в temp 1 или 0 без сдвига бит и маскирования.
Просто хочу знать, есть ли для этого какая-то встроенная функция, или я вынужден написать ее сам.
c++
c
bit-manipulation
Милан
источник
источник
!= 0
верно, так зачем?1
точно так же верно, как0.1415
!Проверьте, установлен ли бит N (начиная с 0):
Для этого нет встроенной функции.
источник
1 << 0
?? Простите, запуталась.1<<0
1 без какой-либо смены (смена 0), то есть1<<0 == 1
Я бы просто использовал std :: bitset, если это C ++. Просто. Прямолинейно. Никаких шансов на глупые ошибки.
или как насчет этой глупости
источник
std::bitset<CHAR_BIT * sizeof(int)>
если быть еще более правильнымДа, я знаю, что мне «не нужно» делать это таким образом. Но я обычно пишу:
Например:
Помимо прочего, этот подход:
Например: #define ABS (X) (((X) <0)? - (X): (X))
ABS (i ++);
источник
На самом деле выбранный ответ неверен. Приведенная ниже функция вернет битовую позицию или 0 в зависимости от того, действительно ли бит включен. Это не то, о чем просил плакат.
Вот что изначально искал плакат. Приведенная ниже функция вернет либо 1, либо 0, если бит включен, а не позицию.
источник
bool has_feature = CHECK_BIT(register, 25);
хорошо знать, что я могу сделать это без двойного отрицания.Согласно этому описанию битовых полей , существует метод прямого определения полей и доступа к ним. Пример в этой записи:
Также там есть предупреждение:
источник
Вы можете использовать Bitset - http://www.cppreference.com/wiki/stl/bitset/start .
источник
Используйте std :: bitset
источник
temp
нужно отражать, чтобы сделать его "прямым порядком"?Есть, а именно внутренняя инструкция _bittest .
источник
Я использую это:
где "pos" определяется как 2 ^ n (например, 1,2,4,8,16,32 ...)
Возвращает: 1, если истина 0, если ложь
источник
4 = 2^(3-1)
для битовой позиции 3, поскольку это было частью вопроса.Я пытался прочитать 32-битное целое число, которое определяло флаги для объекта в PDF-файлах, и это не сработало для меня
что исправлено, это изменяло определение:
операнд & возвращает целое число с флагами, которые оба имеют в 1, и он неправильно переводился в логическое значение, это помогло
источник
!= 0
сделал бы то же самое. Не знаю, чем могут отличаться сгенерированные машинные инструкции.Вы можете «имитировать» сдвиг и маскировку: if ((0x5e / (2 * 2 * 2))% 2) ...
источник
Для низкоуровневого решения x86 используйте код операции x86 TEST .
Однако ваш компилятор должен превратить _bittest в это ...
источник
Почему бы не использовать такую простую вещь?
ВЫХОД: двоичный:
11111111
источник
std::cout << (((status & (1 << i)) ? '1' : '0');
. Вам следует использоватьCHAR_BIT
константу из<climits>
вместо жесткого кодирования 8 бит, хотя в этом случае вы знаете, что результат в любом случае будет 8, поскольку вы используетеuint8_t
pos - установка битовой позиции с 0.
возвращает 0 или 1.
источник
если вам просто нужен настоящий жестко запрограммированный способ:
обратите внимание, что этот hw зависит и предполагает, что этот порядок битов 7654 3210, а var - 8 бит.
Результаты в:
1 0 1 0
источник
Хотя сейчас уже довольно поздно отвечать, есть простой способ узнать, установлен ли N-й бит или нет, просто используя математические операторы POWER и MODULUS.
Допустим, мы хотим знать, установлен ли у 'temp' N-й бит или нет. Следующее логическое выражение вернет истину, если бит установлен, в противном случае - 0.
Рассмотрим следующий пример:
Если я хочу знать, установлен ли 3-й бит или нет, я получаю
Таким образом, выражение возвращает истину, указывая на то, что установлен третий бит.
источник
Один из подходов - проверка при следующих условиях:
Программа объяснения будет:
Вывод:
источник
Я делаю это:
LATGbits.LATG0 = ((m & 0x8)> 0); // чтобы проверить, равен ли бит-2 m 1
источник
самый быстрый способ - поисковая таблица масок
источник