被忽略的教学是否有一些我没有看到的东西?

时间:2013-12-12 19:43:31

标签: c ascii shift skip

我有这个函数将7位字符序列转换为它代表的实际字符(ASCII)。因此,例如,取字符串“1001110”,该函数应返回“N”。

char bits_to_char(char* bits)
{
    byte ret = 0;
    int i = 0;
    for(i = 0; i < CHAR_SZ; i++){
        if(bits[i] == '1'){
            ret++;
        }
        (ret << 1) && 0xFF;
    }
    return (char) ret;

}

Ret上的左移不会发生。当我使用我的调试器逐步完成它时,它只是完全跳过它。我尝试在continue增加后添加ret,但它没有改变任何内容。

2 个答案:

答案 0 :(得分:3)

该行

(ret << 1) && 0xFF;

最好进行操作并丢弃结果。

合理的编译器会发现并优化它

答案 1 :(得分:0)

应在递增ret的值之前完成位移。只有在将字符串转换为值时才需要转换为大写:

unsigned char bits_to_char(const char* bits)
{
    unsigned ret = 0;
    size_t size = strlen(bits);
    int i;
    for(i = 0; i < size; i++){

        ret <<= 1;
        if( bits[i] == '1'){
            ++ret;
        }
    }
    return (unsigned char) (ret & 0xFF);
}