C# 在c中存储布尔数据时如何节省空间#

C# 在c中存储布尔数据时如何节省空间#,c#,azure,C#,Azure,我需要在Windows Azure中存储布尔数据。我想让这些占据的空间尽可能小。我有大约15个字段,它们的值为真或假 field_1 = true; field_2 = true; field_a = false; field_xx = true; 我有一个想法,我可以拿这些,将真和假转换为1和0,然后存储为字符串,比如1101。有没有一个简单的方法,我可以做这个编码,然后解码时,得到的数据?请注意,字段名都是不同的,因此我不能使用forloop来遍历字段名 不用麻烦了。您使用的是布尔值,它已

我需要在Windows Azure中存储布尔数据。我想让这些占据的空间尽可能小。我有大约15个字段,它们的值为真或假

field_1 = true;
field_2 = true;
field_a = false;
field_xx = true;

我有一个想法,我可以拿这些,将真和假转换为1和0,然后存储为字符串,比如1101。有没有一个简单的方法,我可以做这个编码,然后解码时,得到的数据?请注意,字段名都是不同的,因此我不能使用forloop来遍历字段名

不用麻烦了。您使用的是布尔值,它已经是您所能得到的最小值(我相信是1字节)。而且,您可能节省的少量空间不值得增加代码的复杂性,再加上开发代码所需的时间



还有一些想法:想想你会如何使用这样的结构。目前,如果查看
字段_1
并看到值
true
,则无需进一步查看实现以计算实际值。但是,假设您有以下字符串:“100101011010”(或整数值
19162
,这将更有效)。
字段_1
是真还是假?这并不明显——您需要找到实现。当您需要支持更多的字段时会发生什么?坚持你所拥有的,你会省去很多心痛。

不用麻烦了。您使用的是布尔值,它已经是您所能得到的最小值(我相信是1字节)。而且,您可能节省的少量空间不值得增加代码的复杂性,再加上开发代码所需的时间



还有一些想法:想想你会如何使用这样的结构。目前,如果查看
字段_1
并看到值
true
,则无需进一步查看实现以计算实际值。但是,假设您有以下字符串:“100101011010”(或整数值
19162
,这将更有效)。
字段_1
是真还是假?这并不明显——您需要找到实现。当您需要支持更多的字段时会发生什么?如果你坚持你所拥有的,你会省去很多心痛。

将这些存储为字符,每个值需要8或16位。我会使用位移位操作将它们打包到可用的最长无符号整数数组中。

将它们存储为字符,每个值需要8或16位。我会使用位移位操作将它们打包到可用的最长无符号整数数组中。

关于这方面有一篇很好的文章:

关于这一点,有一个很棒的帖子:
我想你甚至无法想象我有多怀疑这会在任何方面、形状或形式上有所帮助。15个布尔人实际上什么都不是


现在,如果你坚持走这条路,最好的方法是将它们存储为单个
int
,然后使用
&
读出它们,然后
将它们写回。

我想你甚至无法想象我有多怀疑这会在任何方式、形状或形式上有所帮助。15个布尔人实际上什么都不是

现在,如果你坚持走这条路,最好的方法是将它们存储为单个
int
,并使用
&
读取它们,然后
写入它们。

查看该类,它应该完全满足你的需要

例如:

BitArray bits = new BitArray
(
    new bool[]
    {
        false, true, false, false, true, 
        false, true, false, true, false,
        false, true, false, true, false
    }
);

short values = 0;

for( int index = 0; index < bits.Length; index++ )
{
    if( bits[ index ] )
        values |= ( short )( values | ( 1 << index ) ); 
}

Console.WriteLine( Convert.ToString( values, 2 ) );
位数组位=新位数组
(
新布尔[]
{
假,真,假,假,真,
假,真,假,真,假,
假,真,假,真,假
}
);
短值=0;
for(int index=0;index
例如:

BitArray bits = new BitArray
(
    new bool[]
    {
        false, true, false, false, true, 
        false, true, false, true, false,
        false, true, false, true, false
    }
);

short values = 0;

for( int index = 0; index < bits.Length; index++ )
{
    if( bits[ index ] )
        values |= ( short )( values | ( 1 << index ) ); 
}

Console.WriteLine( Convert.ToString( values, 2 ) );
位数组位=新位数组
(
新布尔[]
{
假,真,假,假,真,
假,真,假,真,假,
假,真,假,真,假
}
);
短值=0;
for(int index=0;index值|=(短)(值|)(1您可以使用int和xor来实现这一点

我在大约15年前看到过一个这样做的项目。但它最终限制了系统中的32个角色(它使用了32位数字)。该产品现在不存在:)


因此,不要这样做,而是将值存储在数组或单独的字段中。

您可以使用int和xor来实现这一点

我在大约15年前看到过一个这样做的项目。但它最终限制了系统中的32个角色(它使用了32位数字)。该产品现在不存在:)


所以不要这样做,将值存储在数组或单独的字段中。

您可以将Enum与flags属性一起使用。您可以说您有15个字段。因此您可以尝试使用类似 [旗帜] 枚举字段 { 字段1,字段2。。。。 }


查看指导原则

您可以将Enum与flags属性一起使用。您说您有15个字段。因此您可以尝试使用 [旗帜] 枚举字段 { 字段1,字段2。。。。 }


查看指南

您可以使用位数组将布尔值打包到
int

BitArray b = new BitArray(new bool[] { field_1, field_2, ..., field_xy });
int[] buffer = new int[1];
b.CopyTo(buffer, 0);
int data = buffer[0];
BitArray b = new BitArray(new int[] { data });
field_1 = b[0];
field_2 = b[1];
...
field_xy = b[14];
您可以使用
字节
整数
数组。一个
字节
最多可以容纳8个布尔值,一个
整数
最多可以容纳32个布尔值。要容纳16个布尔值,您可以使用一个包含两个字节的字节数组,或一个
整数
数组,这取决于数组的开销或
整数
中未使用的位是否占用更多空间。Yo您还可以使用
位转换器
类将双字节数组转换为

[Flags]
public enum Values
{
  Field1 = 1,
  Field2 = 2,
  Field3 = 4,
  Field4 = 8
}    
Values obj = Field1 | Field2;
obj.HasValue(Field1); //true
obj.HasValue(Field3); //false
int storage = (int)obj;// 3
// Sets the given bit position in the UInt32 to the specified boolean value 
public static UInt32 Set(UInt32 u, int position, bool newBitValue)
{
    UInt32 mask = (UInt32)(1 << position);

    if (newBitValue)
        return (u | mask)
    else
        return (u & ~mask);
}

// Gets a bit value from the supplied UInt32
public static bool Get(UInt32 u, int position)
{
    return ((u & (UInt32)(1 << position)) != 0);
}