首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中将两个对象放在一个字节中

在C++中将两个对象放在一个字节中
EN

Stack Overflow用户
提问于 2021-04-21 16:10:00
回答 2查看 69关注 0票数 3
代码语言:javascript
复制
class A
{
   char c; // c represents a value varying from 0 to 2^7-1 (I don't need a bigger range)
   bool b; // b is a boolean value
}

A使用2个字节。但是,由于c永远不会获得大于2^7-1的值(如注释中所指定的),因此可以使用c字节的一位来表示布尔值b。就像这样

代码语言:javascript
复制
class A
{
    unsigned char x;   // x represents both a value varying from 0 to 2^7-1 and a boolean value

public:
    A(unsigned char c, bool b)
    {
        assert(c <= 127);
        x = c;
        if (b) x += 128;
    }

    unsigned char getC()
    {
        if (x >= 128) return x - 128; else return x;
    }

    bool getB()
    {
        return x >= 128;
    }
};

现在,类A使用了一个字节。我怀疑我想要做的事情可能是很常见的,也许有一个更简单、更快或更标准的解决方案来做到这一点。有没有更好的解决方案把两个对象塞进一个字节?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-21 16:18:23

您可以使用位域为成员提供特定的位大小。

代码语言:javascript
复制
#include  <iostream>

struct A {
    unsigned char c : 7;
    bool b : 1;
};


int main() {
    std::cout << sizeof(A);
}

Demo

票数 5
EN

Stack Overflow用户

发布于 2021-04-21 20:58:47

如果您的代码绝对必须将这两个值存储在单个8位字段中,请使用掩码:

代码语言:javascript
复制
struct a {
    unsigned char value;
    unsigned char get_c() const { return value & 0x7F; }
    void set_c(unsigned char c1} {
        value &= 0x80;
        value |= (c1 & 0x7F);
    }
    bool get_b() const { return value & 0x80; }
    void set_b(bool b1) { value &= 0x7F; value |= (b1 ? 0x80 : 0); }
};

显然,使用位域更简单,但是位域布局的细节取决于实现;您不能保证将两个加起来为8位的字段存储在单个8位对象中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67191753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档