Побитовый сдвиг в C - PullRequest
       51

Побитовый сдвиг в C

3 голосов
/ 11 апреля 2010

Я недавно решил провести SMS-проект для отправки и получения SMS-сообщений через мобильный телефон.

Данные отправляются в формате PDU - мне необходимо изменить символы ASCII на 7-битные символы алфавита GSM. Для этого я натолкнулся на несколько примеров, таких как http://www.dreamfabric.com/sms/hello.html

В этом примере показаны крайние правые биты второго септета, вставляемые в первый, для создания октета.

Побитовые сдвиги не приводят к тому, что это произойдет, так как >> будет вставлено слева, а

Спасибо

Ответы [ 2 ]

3 голосов
/ 11 апреля 2010

Вот быстрый алгоритм для этого:

int b1, bnext;
int mod;
int pand;
char *b; // this is your byte buffer, with message content
int blen; // this is your byte buffer length
char sb[160];
int totchars = 0;

b1 = bnext = 0;
for (int i=0; i < blen; i++) {
    mod = i%7;
    pand = 0xff >> (mod + 1);
    b1 = ((b[i] & pand) << mod) | bnext;
    bnext = (0xff & b[i]) >> (7 - mod);
    sb[totchars++] = (char)b1;
    if (mod == 6) {
        sb[totchar++] = (char)bnext;
        bnext = 0;
    }
}
sb[totchar] = 0;

Он преобразует 7-битные сжатые буферы в обычные массивы символов ASCII в C.

0 голосов
/ 11 апреля 2010

Может кто-нибудь сказать мне, как переместить биты с правой стороны и вставьте их слева?

В C есть косвенные способы, но я бы просто сделал это так:

void main()
{
    int x = 0xBAADC0DE;
    __asm
    {
        mov eax, x;
        rol eax, 1;
    }
}

Это будет вращать (не сдвигать!) Биты влево (один шаг). «ror» будет вращаться вправо.

...