gpt4 book ai didi

c++ - 为什么相同的位集不转换为相同的 ulong

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:46 26 4
gpt4 key购买 nike

我正在处理 std::bitset<16> vector 中的数据,我都必须使用自制函数与 unsigned long(通过 std::bitset::to_ulong())和字符串相互转换(确切的算法与这个问题无关)

bitset vector 和字符串之间的转换起初似乎工作正常,因为如果我首先将 bitset vector 转换为字符串然后再返回到 bitset,它是相同的;我已经通过制作一个包含以下内容的程序证明了这一点:

for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<std::endl;//print bitsets before conversion

bitset_to_string(my_bitset16vector,my_str);
string_to_bitset(my_bitset16vector,my_str);

std::cout<<std::endl
for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<std::endl;//print bitsets after conversion

输出可能看起来像这样(在本例中只有 4 个位集):

1011000011010000
1001010000011011
1110100001101111
1001000011001111

1011000011010000
1001010000011011
1110100001101111
1001000011001111

据此判断,转换前后的位集显然是相同的,但是尽管如此,当我告诉它们转换为 unsigned long 时,位集的转换完全不同;在一个看起来像这样的程序中:

for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<".to_ulong()="<<B.to_ulong()<<std::endl;//print bitsets before conversation

bitset_to_string(my_bitset16vector,my_str);
string_to_bitset(my_bitset16vector,my_str);

std::cout<<std::endl
for (std::bitset<16>& B : my_bitset16vector) std::cout<<B<<".to_ulong()="<<B.to_ulong()<<std::endl;//print bitsets after conversion

输出可能看起来像这样:

1011000011010000.to_ulong()=11841744
1001010000011011.to_ulong()=1938459
1110100001101111.to_ulong()=22472815
1001000011001111.to_ulong()=18649295

1011000011010000.to_ulong()=45264
1001010000011011.to_ulong()=37915
1110100001101111.to_ulong()=59503
1001000011001111.to_ulong()=37071

首先很明显,当显示为二进制时,位集仍然超越所有合理怀疑是相同的,但是当转换为无符号长整型时,相同位集返回完全不同的值(完全毁了我的程序)

这是为什么?难道 bitsets 是不一样的,即使它们打印的一样?尽管位集相同,但我的位集与字符串转换器之间是否存在错误?

编辑:不是所有的程序,包括我的对话都有这个问题,只有当我在创建它(从一个字符串)后修改了它时才会发生,在我的例子中是试图加密比特集,它根本无法被切割归结为简单而简短的内容,但以我最压缩的方式编写它看起来像这样:

(甚至不包括公钥结构和模幂函数的定义)

int main(int argc, char**argv)
{
if (argc != 3)
{
std::cout<<"only 2 arguments allowed: plaintext user"<<std::endl;
return 1;
}

unsigned long k=123456789;//any huge number loaded from an external file
unsigned long m=123456789;//any huge number loaded from an external file


std::vector< std::bitset<16> > data;
std::string datastring=std::string(argv[1]);

string_to_bitset(data,datastring);//string_to_bitset and bitset_to_string also empties string and bitset vector, this is not the cause of the problem

for (std::bitset<16>& C : data)
{
C =std::bitset<16>(modpow(C.to_ulong(),k,m));//repeated squaring to solve C.to_ulong()^k%m
}

//and now the problem happens


for (std::bitset<16>& C : data) std::cout<<C<<".to_ulong()="<<C.to_ullong()<<std::endl;

std::cout<<std::endl;

bitset_to_string(data,datastring);
string_to_bitset(data,datastring);
//bitset_to_string(data,datastring);

for (std::bitset<16>& C : data) std::cout<<C<<".to_ulong()="<<C.to_ullong()<<std::endl;

std::cout<<std::endl;
return 0;
}

我很清楚你们现在都认为我做错了模块化电源功能(我保证我没有),但我正在做的事情实际上并不重要,对于我的问题不是:我的程序出了什么问题;我的问题是:为什么相同的位集(打印相同的二进制 1 和 0)不转换为相同的无符号长整型。

其他编辑:我还必须指出,unsigned longs 的第一个 printet 值是“正确的”,因为它们在使用时允许我完美地解密位集,而随后打印的 unsigned longs 的值是“错误的”它会产生一个完全错误的结果。

最佳答案

“11841744”值在低 16 位中是正确的,但在第 16 位以上有一些额外的设置位。这可能是您的 STL 实现中的一个错误,其中 to_long 访问超过它应该使用的 16 位的位。

或者(根据您上面的评论)您向位集添加的位数超出了它的容量,并且您遇到了未定义的行为。

关于c++ - 为什么相同的位集不转换为相同的 ulong,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40872815/

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