gpt4 book ai didi

c++ - bitset<10> 和 bitset<2>(input[i]) 的区别,需要解释

转载 作者:行者123 更新时间:2023-11-28 05:12:53 29 4
gpt4 key购买 nike

我今天刚刚学习了一些简单的加密,并编写了一个简单的程序将我的文本转换为 10 位二进制。我不确定我做的是否正确,但是代码的注释部分和实际代码有 2 个不同的 10 位输出。我很困惑。谁能用通俗易懂的语言向我解释一下?

#include <iostream>
#include <string>
#include <bitset>
#include "md5.h"

using namespace std;
using std::cout;
using std::endl;

int main(int argc, char *argv[])
{
string input ="";
cout << "Please enter a string:\n>";
getline(cin, input);

cout << "You entered: " << input << endl;
cout << "md5 of " << input << ": " << md5("input") << endl;
cout << "Binary is: ";
// cout << bitset<10>(input[1]);
for (int i=0; i<5; i++)
cout << bitset<2>(input[i]);
cout << endl;

return 0;
}

最佳答案

tl;dr :一个 char 是 8 位,字符串 operator[] 返回不同的 chars,因此您访问了不同的 chars 并获取了它们的前两位。解决方案是将 char 完全视为:8 位。通过一些巧妙的位操作,我们可以达到预期的效果。

问题

虽然我还没有完全理解你想要做什么,但我可以回答这段代码可能有什么问题:

通过调用

cout<<bitset<10>(input[1]);

您正在读取从第二个字符开始的 10 位(input[0] 将从第一个字符开始)。

现在,循环做了完全不同的事情:

for (int i=0; i<5; i++)
cout << bitset<2>(input[i]);

它使用字符串的第 i 个字符并从中构造一个位集。

reference bitset 构造函数告诉我们这意味着 char 被转换为 unsigned long long,然后被转换为 bitset。

好吧,让我们看看它是如何处理一个简单的输入字符串的,比如

std::string input = "aaaaa";

这个字符串的第一个字符是'a',它给你'01100001'(ASCII 表)的8 位,因此从中构造的10 位位集结果打印

0001100001

我们看到左边的位有明显的填充(更重要)。

另一方面,如果您使用循环遍历字符,则访问每个字符并只占用其中的 2 个位。

在我们的字符 'a'='01100001' 的例子中,这些位是 '01'。那么你的程序将输出 01 五次。

现在,修复它的方法是更多地考虑您实际访问的位。

可能的解决方案

无论如何都要得到字符串的前十位?

在这种情况下,您需要编写如下内容:

std::bitset<10>(input[0]);
//Will pad the first two bits of the bitset as '0'

for(int i=0;i<5;++i){
char referenced = input[i/4];
std::bitset<2>((referenced>>(6-(i%4)*2)));
}

循环代码经过重新设计,可以按顺序将整个字符串读入 2 位位集。因此,由于在一个 char 中有 8 位,我们可以从一个 char 中读取其中的 4 个集合 -> 这就是“引用”的原因。

循环下半部分的移位使其以移位 6 开始,然后是 4,然后是 2,然后是 0,然后为下一个字符重置为 6,等等...(这样,我们可以从每个 8 位字符中提取 2 个相关位)

这种类型的循环实际上会读取字符串的所有部分并进行正确的构造。

最后一句话

要直接从您的字符串构造一个位集,您必须使用以位为单位的原始内存,并从中构造位集。您可以从每个字符构建 8 位位集并将它们相互附加,或者从每个 8 位位集创建一个字符串,连接它们,然后使用 1 和 0 的最终字符串来构建任意大小的大位集。

希望对您有所帮助。

关于c++ - bitset<10> 和 bitset<2>(input[i]) 的区别,需要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43190090/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com