用C ++声明一点

时间:2014-05-08 06:33:19

标签: c++

我编写了一个具有高内存成本要求的程序,我希望节省内存而不会丢失性能。 所以我想把每个只有两种情况的变量改成位。

但我找不到C ++中的位类型,而STL中的bitset总是32位机器中4字节的倍数。 编写数据结构来管理位将导致性能丢失。

有没有办法像bit a;一样声明一个比特值?

谢谢大家。最后我想要的答案是:“你不能用C ++购买半个字节”。

5 个答案:

答案 0 :(得分:5)

没有。最小的可寻址实体是一个字节。这是char或unsigned char类型。 (最好的类型是整数,因为它与处理器的宽度对齐,因此最快获取和处理)

要使用位,您需要使用布尔运算符并在较大类型中屏蔽/移位数据。或者使用STL位集。

答案 1 :(得分:1)

您可以使用位字段。或者使用带有bool类型的std :: vector,它具有模板特化。

答案 2 :(得分:1)

没有像" bit"这样的数据类型。特别。一种做法是使用标准的uint8_t(或uint16,32)并将各个位用于不同的值。 E.g:

#define BIT1 0x01
#define BIT2 0x02
#define BIT3 0x04
#define BIT4 0x08

uint8_t bit_vars;

// Make a function to access a particular bit
uint8_t get_bitx(int x)
{
    switch (x)
    {
    case 1:
        return bit_vars & BIT1;
        break;
    case 2:
        return bit_vars & BIT2;
        break;
    case 3:
        return bit_vars & BIT3;
        break;
    case 4:
        return bit_vars & BIT4;
        break;
}

// Make a function to set/storea particular bit
void set_bitx(int x, bool set_flag)
{
    switch (x)
    {
    case 1:
        if (set_flag) {bit_vars |= 1 << (BIT1 - 1);}
        break;
    case 2:
        if (set_flag) {bit_vars |= 1 << (BIT2 - 1);}
        break;
    case 3:
        if (set_flag) {bit_vars |= 1 << (BIT3 - 1);}
        break;
    case 4:
        if (set_flag) {bit_vars |= 1 << (BIT4 - 1);}
        break;
}

注意:这只是一个粗略的例子,不可编译。

你也可以使用位字段,我个人倾向于远离它们,因为它们并不总是可以在不同的处理器/编译器中移植。

答案 3 :(得分:1)

来源:http://www.learncpp.com/cpp-tutorial/3-8a-bit-flags-and-bit-masks/

如果您使用简单的布尔值,上面的示例显示了如何将它们作为单位字节​​内的位值分隔。

C ++ 14 定义8个独立的位标志(这些可以代表你想要的任何东西)

const unsigned char option1 = 0b0000'0001;    
const unsigned char option2 = 0b0000'0010;    
const unsigned char option3 = 0b0000'0100;    
const unsigned char option4 = 0b0000'1000;    
const unsigned char option5 = 0b0001'0000;    
const unsigned char option6 = 0b0010'0000;    
const unsigned char option7 = 0b0100'0000;    
const unsigned char option8 = 0b1000'0000;

C++11 or earlier
Define 8 separate bit flags (these can represent whatever you want)

const unsigned char option1 = 0x1; // hex for 0000 0001     
const unsigned char option2 = 0x2; // hex for 0000 0010    
const unsigned char option3 = 0x4; // hex for 0000 0100   
const unsigned char option4 = 0x8; // hex for 0000 1000    
const unsigned char option5 = 0x10; // hex for 0001 0000    
const unsigned char option6 = 0x20; // hex for 0010 0000    
const unsigned char option7 = 0x40; // hex for 0100 0000    
const unsigned char option8 = 0x80; // hex for 1000 0000

我们使用字节大小的值来保存我们的选项 myflags中的每个位对应于上面定义的选项之一

unsigned char myflags = 0; -- all options turned off to start

要查询位状态,我们使用按位AND('&amp;'运算符):

if (myflags & option4) ... -- if option4 is set, do something
if !(myflags & option5) ... -- if option5 is not set, do something

要设置一个位(打开),我们使用按位OR('|'运算符):

myflags |= option4; -- turn option 4 on.
myflags |= (option4 | option5); -- turn options 4 and 5 on.

要清除一点(关闭),我们使用按位AND和反(〜)位模式:

myflags &= ~option4; -- turn option 4 off
myflags &= ~(option4 | option5); -- turn options 4 and 5 off

要切换位状态,我们使用按位异或:

myflags ^= option4; -- flip option4 from on to off, or vice versa
myflags ^= (option4 | option5); -- flip options 4 and 5

您可以使用:static_cast(value)将所述值转换为bool。

答案 4 :(得分:0)

使用整数存储(32位),其中bit表示1个变量。 确实这会让你的代码变得丑陋但是如果你希望进行内存优化,你必须在其他地方付费。

访问每个变量的“位”应该通过对该整数的逐位运算来完成。