向右转/我做错了什么?

时间:2009-12-14 18:20:54

标签: c bit-manipulation shift

不能正常工作,因为它没有将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

2 个答案:

答案 0 :(得分:9)

你可能想要“unsigned char * buffer;”这会将零移位到顶部位而不是保留符号位。

答案 1 :(得分:2)

“它没有将MSB位设置正确”。

C标准说:

6.5.7 / 5 ...如果E1具有有符号类型和负值,则结果值是实现定义的。

请参阅此草稿,例如:http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

据推测,char已在您的编译器上签名,因此您应该检查编译器文档以查看MSB的正确值。以及其他所有内容。