Посмотрите на каждый бит в памяти в отдельности
После прочтения вопроса, как получить побитовые данные из целочисленного значения в c? Я вижу, что если я хочу посмотреть на каждый бит целым числом, я должен сдвинуть целое число вправо и замаскировать его. Но мне интересно, возможно ли получить доступ к каждому биту в памяти без такого сложного кода? Используя pointer
или что-то типа того.
3 ответа
Это можно сделать без смещения и маскировки, но это не так сложно сделать:
#include <stdio.h>
#include <stdbool.h>
unsigned int ui_pow(unsigned int base, unsigned int exponent)
{
unsigned int result = 1;
for ( unsigned int i = 1; i <= exponent; ++i ) {
result *= base;
}
return result;
}
bool bit_is_set_one(unsigned int n, unsigned int bit)
{
return (n >> bit) & 1;
}
bool bit_is_set_two(unsigned int n, unsigned int bit)
{
return (n / ui_pow(2, bit)) % 2;
}
int main(void)
{
bool all_equal = true;
for ( unsigned int i = 0; i < 65535; ++i ) {
for ( unsigned int j = 0; j < 16; ++j ) {
if ( bit_is_set_one(i, j) != bit_is_set_two(i, j) ) {
all_equal = false;
}
}
}
printf("Methods%s give equal results.\n", all_equal ? "" : " do not");
return 0;
}
какие выводы:
paul@thoth:~/src/sandbox$ ./altshift
Methods give equal results.
paul@thoth:~/src/sandbox$
В Си побитовые операции, такие как сдвиг, являются одним из единственных способов манипулировать переменными на битовом уровне. На первый взгляд его выражения могут быть несколько "уродливыми", но, как и все на практике, вскоре их будет легко понять.
Просто продолжай.
Вот интересная статья для вашего интереса: немного веселья: веселье с кусочками
Если вы знаете местоположение бита, вы можете сделать битовую маску без сдвига. Например: (i & 0x02) Вы получите 0x02, если 2-й бит справа равен 1, или 0x00, если 2-й бит равен 0. Обычно используется макрос: #define BitMask(i) (1 << (i)) Для константы i сдвиг будет обрабатываться на этапе компиляции, и он не будет отображаться в конечных двоичных файлах.