0

这是我的程序:

static void undo_bitstring(std::string& str) { 
    for (unsigned i = 0; i < str.length(); i += charbits) { 
        int ascii_val = 0; 
        for (unsigned j = 0; j < charbits; j++) { 
            if (str[i+j] == '1') ascii_val += (int)exp2(charbits-j-1);
        }
        str[i/charbits] = (char)ascii_val;
    }
    str.erase(str.begin()+str.size()/charbits,str.end());
}

在哪里,只是让你知道,

charbits 

被定义为

static const size_t charbits = 8 * sizeof(char);

应该发生的事情是,例如,

std::string str = "01010111";
undo_bitsring(str);

应该将 str 更改为

"W"

自从

0x2^7 + 1x2^6 + 0x2^5 + 1x2^4 + 0x2^3 + 1x2^2 + 1x2^1 + 1x2^0 
= 64 + 16 + 4 + 2 + 1
= 87

(int)'W' = 87

当然,这个过程应该适用于任何长度为字符位倍数的 0 和 1 字符串。例如,

std::string str = "010101110101011101010111";
undo_bitsring(str);

应该将 str 更改为

"WWW"

在我运行的测试中,输出看起来就像一堆带有问号的盒子,表示某种错误。

有任何想法吗?

我一开始就完全犯了这个错误吗?这是我正在尝试制作的一些加密/解密算法的一部分。

4

1 回答 1

1

你知道>>and<<运算符吗?这些运算符在应用于 int 时会将位 1 的位置向右或向左移动。它可能比使用更可靠(int)exp2(charbits-j-1);

于 2013-08-07T17:49:34.320 回答