маскировка нежелательных бит в с - PullRequest
4 голосов
/ 03 марта 2011

Учитывая десятичное значение 71744474 в двоичном виде, это 0100010001101011101111011010, что я пытаюсь извлечь из этого десятичного числа каждые семь бит, начиная с младших бит.Каждый из семи битов должен представлять печатный символ ASCII, который может иметь только 7 битов.Всего я вытаскиваю четырех персонажей.Первый символ - 1011010, то есть Z в ASCII.Следующий символ - w и так далее.Я думаю, что есть способ замаскировать биты, которые меня волнуют.

Ответы [ 4 ]

7 голосов
/ 03 марта 2011

Используйте побитовые операторы:

0100010001101011101111011010 & 0000000000000000000001111111 = 1011010

Чтобы получить второго персонажа, выполните

0100010001101011101111011010 & 0000000000000011111110000000

и т. Д. *

3 голосов
/ 03 марта 2011

Что-то вроде этого должно быть достаточно:

#include <stdio.h>

int main (void) {
    unsigned int value = 71184592; // Secret key :-)

    for (unsigned int shift = 0; shift < 28; shift += 7)
        printf ("%c", (value >> shift) & 0x7f);
    putchar ('\n');

    return 0;
}

Он использует сдвиг битов, чтобы получить нужные биты в семь младших разрядов значения, и маскирование битов, чтобы очистить все остальные биты.

Если вы запустите этот код, вы увидите, что он вполне может извлекать отдельные символы ASCII в группы по семь битов в каждой:

Pax!
2 голосов
/ 03 марта 2011
int myN  = 71744474;
int mask = 0x7F7F7F7F; // 7F is 0111 1111, or 7 on bits.

int result = myN & mask;

char myBytes[4];
myBytes[0] = (char)((result        & 0x000000FF);
myBytes[1] = (char)((result >>  8) & 0x000000FF);
myBytes[2] = (char)((result >> 16) & 0x000000FF);
myBytes[3] = (char)((result >> 24) & 0x000000FF);


// Now, examine myBytes[0-3], and I think they'll be what you want.
0 голосов
/ 03 марта 2011
#include <stdio.h>

int main()
{
    int a = 71744474;
    a = a&0xFFFFFFF; // 1111111 1111111 1111111 1111111
    while (a>0) {
        char b = a&0x7f; // 1111111
        printf("%c", b);
        a = a>>7;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...