关于 bitset类型 的两个问题

kevindong333 2009-04-15 10:02:59
我要编一个密码学作业,要用到bitset类型,

我创建了一个64位的bitset类型
bitset<64> CipherWord=0x0101010101010101;

=========================================================

但是编译时出现警告
warning C4305: 'argument' : truncation from 'unsigned __int64' to 'unsigned long'
warning C4309: 'argument' : truncation of constant value

赋值的结果也没到预期期望===>初值被切断了

CipherWord [64](1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) std::bitset<64>
没有达到预期期望

==========================================================

为什么会产生这种错误,怎么解决?
即使 bitset<64> CipherWord=0x0101010101010101ul;也不行,


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二个问题
为什么对于bitset类型,用传统的调用构造函数的方法不行,也就是:

bitset<64> CipherWord.bitset(...);

而必须得用其特定的形式:
bitset<64> x=....;
bitset<64> x('');

难道bitset是一个很特殊的类吗?


谢谢!
...全文
489 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevindong333 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ymll1 的回复:]
好像还是没明白楼主的意思
String a=String("example");
bitset <64> a=0x10101010;===>这个与上述不匹配
这两个不一样吧,String("example")首先创建一个匿名的String对象,
然后把这个匿名对象赋值给a,
第二个等号两边类型不一样,你这样赋值有点像强制类型转换,跟上面对
应的写法应该是bitset <64> a= bitset <4>(0x10101010)
但是bitset貌似没有复制构造函数,这样不知道行不行……
你直接bitset <64> a(0…
[/Quote]
换个问法:
对于自定义的类,一旦定义了该类的对象就会调用构造函数,对吗?
string a=string("example");===>调用构造函数 string("...")

自定义类型有强制转换吗?强制转换的规则是在哪定义的--构造函数?
bitset <64> a=0x10101010;===>强制转换?

我要定义一个des类,而这个类的数据断有一个是bitsrt<64> 类型的,而我在这个类的构造函数中需要对这个对象赋值,所以想知道bitset的构造函数的非省略形式的调用方法。
:)
jakqigle 2009-04-15
  • 打赏
  • 举报
回复
呵呵,实在不清楚可以参考下msdn的bitseta
kevindong333 2009-04-15
  • 打赏
  • 举报
回复
还有个问题
对于bitset类型,当要赋值时,只能一位一位来赋值吗?不能一串一串来赋值吗?

如想要将bitset<8> a的最先4位复制给bitset<4> b必须得循环一位一位来复制吗?
ymll1 2009-04-15
  • 打赏
  • 举报
回复
好像还是没明白楼主的意思
String a=String("example");
bitset <64> a=0x10101010;===>这个与上述不匹配
这两个不一样吧,String("example")首先创建一个匿名的String对象,
然后把这个匿名对象赋值给a,
第二个等号两边类型不一样,你这样赋值有点像强制类型转换,跟上面对
应的写法应该是bitset <64> a= bitset<4>(0x10101010)
但是bitset貌似没有复制构造函数,这样不知道行不行……
你直接bitset <64> a(0x10101010)不就行了?这样程序开销还小

5楼的问题我也不知道怎么办,期待高手……

另,你用的是C++么,好像是string而不是String吧?
kevindong333 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ymll1 的回复:]
刚翻了一下primer,bitset可以用std::string初始化的,这个似乎可以解决64位的问题
但是似乎可行性不大,写64位二进制码的字符串,会疯掉的……
[/Quote]

对,这个问题如何解决呢?
kevindong333 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ymll1 的回复:]
win32系统下,编写代码如下,
C/C++ code
#include <cstdlib>
#include <iostream>
#include <bitset>

using std::bitset;
using std::cout;
using std::endl;

int main(int argc, char *argv[])
{
long find_long_bit;

for(find_long_bit = 1; find_long_bit>0; ++find_long_bit);

cout<<find_long_bit<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}



用dev…
[/Quote]
第一个问题明白了。
第二个问题是这样的:
一般的类的构造函数都是与类名一样的,比如我定义一个String类,假设构造函数是 String(char *)
而一般的类对象调用构造函数如下
String a=String("example");
或者
String a("exmple");
==============================
但是在bitset中,初始化是这样的
bitset<64> a=0x10101010;===>这个与上述不匹配
或者
bitset<64> a("1010...")===>这个匹配第二个

我的问题是:
1,有没有 bitset<64> a=bitset(...);这样形式的初始化
2,bitset<64> a=0x10101010;是bitset比较特殊的一种初始化方法吗?
ymll1 2009-04-15
  • 打赏
  • 举报
回复
刚翻了一下primer,bitset可以用std::string初始化的,这个似乎可以解决64位的问题
但是似乎可行性不大,写64位二进制码的字符串,会疯掉的……
ymll1 2009-04-15
  • 打赏
  • 举报
回复
win32系统下,编写代码如下,

#include <cstdlib>
#include <iostream>
#include <bitset>

using std::bitset;
using std::cout;
using std::endl;

int main(int argc, char *argv[])
{
long find_long_bit;

for(find_long_bit = 1; find_long_bit>0; ++find_long_bit);

cout<<find_long_bit<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}

用dev_c++和VC编译并运行,结果都是-2147483648
结论:long类型在本人所用的环境下只有32位,
而0x0101010101010101有64位,引起赋值错误

第二个问题没明白楼主的意思
bitset<64> CipherWord.bitset(...);
不应该是bitset<64> CipherWord(...)么

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧