求助,一定及时给分!

bigiron 2003-06-12 06:17:08
有什么办法可以放209bit(是bit,不是byte)的数据,而且存储区一个bit都不能多,怎么办,请指点,分不够可以加的!

另外,C++ 中bool对象的内存结构是怎么样的呀?

谢谢!
...全文
37 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjtuzhw 2003-06-13
  • 打赏
  • 举报
回复
试一下把存储区设置一下,或者另建存储区
benbenhuhu 2003-06-13
  • 打赏
  • 举报
回复
bool是8位。
flmttm 2003-06-13
  • 打赏
  • 举报
回复
up
bigiron 2003-06-13
  • 打赏
  • 举报
回复
我给的分少了,所以不太好分,下次一定给多!
bigiron 2003-06-13
  • 打赏
  • 举报
回复
谢谢大家,结贴!
cdocument 2003-06-13
  • 打赏
  • 举报
回复
无法做到,内存都是以字节为存储单位的。
logdzc 2003-06-12
  • 打赏
  • 举报
回复
这是当年高一刚学编程时写的代码,执行位的存取操作,用作一个自定义压缩格式的文件压缩解压
呵呵,现在看惨不忍睹,我把变量名稍改了一下(否则现在我自己都看不懂呵呵),其他不动了

void putbit(int x, FILE* fp)
{
static unsigned int bitcount = 0;
static unsigned char byte = 0;

byte <<= 1;
byte += x;
bitcount ++;
if (bitcount == 8)
{
bitcount = 0;
putc(byte, fp);
byte = 0;
}
}

int getbit(FILE* fp)
{
static unsigned bitcount = 0;
static char byte = 0;

if (bitcount == 0) byte = getc(fp);
int tmpcount = bitcount;
if (++bitcount == 8) bitcount = 0;
return byte >> (7-tmpcount) & 1;
}
短歌如风 2003-06-12
  • 打赏
  • 举报
回复
lifanxi的方法是使用位域,但我们知道位域是超级不可移植的,属于C应用的禁区。存储时应该使用整数数组(快一些)或字节数组(空间效率好一些),设置和读取某一位时用按位逻辑运算和移位运算操作。
我以前在另一个贴子中写过这种实现方法,不过没找到那个贴子,只好再给你写一遍了:

void SetBit(int * Data, int Index)
{
Data[Index / sizeof(int)] |= 1 << (Index % sizeof(int));
}
void ClearBit(int * Data, int Index)
{
Data[Index / sizeof(int)] &= ~(1 << (Index % sizeof(int)));
}
bool GetBit(int * Data, int Index)
{
return (Data[Index / sizeof(int)] & (1 << (Index % sizeof(int)))) != 0;
}
短歌如风 2003-06-12
  • 打赏
  • 举报
回复
开玩笑吧!209不是8的整数倍,而存储空间必须是8的整数倍(比特)。
bool型变量要占一个字节,但用std::vector<bool>可以做到每个元素只用1位。
cloudtarget 2003-06-12
  • 打赏
  • 举报
回复
位段的使用有些规则吧
zhukeke 2003-06-12
  • 打赏
  • 举报
回复
不是不行,我想应该是楼主没把问题说清楚,楼主的意思是不是有一组209bit的数据必须一个接一个地连续存放?请楼主回答。如果是这样,就按我上面的作法吧。
boyfling 2003-06-12
  • 打赏
  • 举报
回复
肯定不行的。
编译器都会字节对齐,bool一般都是一个字节表示。
luixui 2003-06-12
  • 打赏
  • 举报
回复
学习
fullsail 2003-06-12
  • 打赏
  • 举报
回复
而且存储区一个bit都不能多?
这是没有法子作到到的,即使你用汇编,也会有字节对齐的问题。
zhukeke 2003-06-12
  • 打赏
  • 举报
回复
很显然,楼主有一个汇编语言级的结构(该结构占209二进制位), 并且由该结构构成的数据要无缝连接,这只能用按位逻辑运算来实现(用lifanxi的方法只能实现该结构的语法,但不能实现无缝连接)。
oyd 2003-06-12
  • 打赏
  • 举报
回复
int b : 1;
这是位段,指以位为单位定义长度的结构体类型中的成员。
晨星 2003-06-12
  • 打赏
  • 举报
回复
为什么非要“存储区一个都不能多”?这根本无法做到,内存都是以字节为存储单位的(这还不考虑字对齐)。能让内存真正保存一个7位的值,然后另一位借给另一个变量用吗(注意位段并不是变量,使用位段的变量也必然保存在8的倍数个位数的内存单元里)?不能。
CPU真正能真正从内存读7位吗?不能,最多也只能读入8位,然后使用7位。事实上,“真正”读8位都难,64位CPU都出来了。
所以,还是保存216位,然后使用其中的209位吧。

bool结构的存储C++标准没做规定,所以不同的编译器实现可能不一样,但通常是8位。
BinaryWorld 2003-06-12
  • 打赏
  • 举报
回复
编译器在开辟内存的时候不可能会 开辟出非8整数倍bit长度的内存。
每8BIT为BYTE,而系统只位BYTE分配了地址。那么你多出来的位,怎么访问?

可行的办法就是:开辟出8整数倍数的BIT长度的内存,然后最后一段内存可以只使用其中的一部分。

楼上的方法,在下测试了,但不知道b:1是什么语法?在下以前没有见过这样的声明规则。
lifanxi 2003-06-12
  • 打赏
  • 举报
回复
试试
struct aa
{
int a[52];
int b : 1;
};
cwanter 2003-06-12
  • 打赏
  • 举报
回复
bitset试试~
加载更多回复(2)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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