Посмотрите на каждый бит в памяти в отдельности

После прочтения вопроса, как получить побитовые данные из целочисленного значения в 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 сдвиг будет обрабатываться на этапе компиляции, и он не будет отображаться в конечных двоичных файлах.

Другие вопросы по тегам