Не работает должным образом, поскольку не устанавливает правильный бит 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 входной буфер (непосредственно перед циклом for) 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

1
Luka Rahne 14 Дек 2009 в 21:20
6
Определите «правильный». Каков ваш вклад? Какого результата вы ожидаете? Какой результат вы видите?
 – 
jason
14 Дек 2009 в 21:23
Ваш компилятор реализует char как подписанный char. Используйте любой из приведенных ниже ответов, чтобы смещенное значение не оставило неизменным знаковый бит.
 – 
Richard Pennington
14 Дек 2009 в 21:33

2 ответа

Лучший ответ

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

9
Richard Pennington 14 Дек 2009 в 21:35
Сдвиг вправо знакового значения не всегда сохраняет знаковый бит. См. Ответ Стива Джессопса. Также см. Некоторые обсуждения с вопросом: stackoverflow.com/questions/1857928/…
 – 
Trent
15 Дек 2009 в 03:34
1
@ Трент: Я не говорил ему сдвигать вправо знаковое значение. Я сказал ему сдвинуть вправо беззнаковое значение.
 – 
Richard Pennington
15 Дек 2009 в 04:46
@Trent: На самом деле, как говорит ваша ссылка, даже подписанные смены обычно работают так, как ожидалось. Я не знаю об архитектуре (в настоящее время), которую они не знают.
 – 
Richard Pennington
15 Дек 2009 в 04:58
1
Трент привел пример в комментарии к ответу на этот вопрос, который содержит такое же неверное утверждение: «Компилятор Microchip C18 (ссылку на руководство пользователя можно найти здесь: tinyurl.com/ybt2svs - см. раздел B.4)". Я не знаю ЦП, у которого есть «подписанные» и «беззнаковые» регистры, поэтому обратите внимание, что компилятор решает, какой сдвиг использовать для целочисленных типов со знаком. Архитектура тут ни при чем. Если у него вообще нет арифметического сдвига, и в этом случае он ограничивает то, что компиляторы могут эффективно делать с этой архитектурой.
 – 
Steve Jessop
15 Дек 2009 в 06:11
@Richard, я знаю, что вы сказали ему сдвинуть беззнаковое значение, но вы также неправильно подразумевали, что сдвиг вправо знакового значения сохраняет знаковый бит.
 – 
Trent
15 Дек 2009 в 08:06

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

Стандарт C говорит:

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

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

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

2
Steve Jessop 15 Дек 2009 в 03:30