сдвиг вправо / что я делаю не так? - PullRequest
1 голос
/ 14 декабря 2009

Не работает должным образом, потому что он не устанавливает правильный бит MSB. Я использую компилятор metrowerks.

//shifting right 5 characters
char * buffer;
buffer=global_buffer;
for(i=0;i<5;i++) //shift right for 1;
{
    buffer[17-i]=(buffer[17-i]>>1)|(buffer[17-i-1]<<7);
}

EDIT входной буфер (непосредственно перед циклом) 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x2F, 0xA0,0xC6,0x9D

я получил после цикла 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x17,0xD0,0xE3,0xCE

Ответы [ 2 ]

9 голосов
/ 14 декабря 2009

Возможно, вы хотите "unsigned char * buffer"; Это сместит нули в верхние биты, а не сохранит знаковый бит.

2 голосов
/ 14 декабря 2009

"он не устанавливает правильный бит MSB".

Стандарт C гласит:

6.5.7 / 5 ... Если E1 имеет тип со знаком и отрицательное значение, результирующее значение определяется реализацией.

См. Этот черновик, например: http://www.open -std.org / jtc1 / sc22 / WG14 / www / docs / n1256.pdf

Предположительно char подписан на вашем компиляторе, поэтому вы должны проверить документацию по вашему компилятору, чтобы увидеть, каково правильное значение MSB. И все остальные биты.

...