C# 在c中存储布尔数据时如何节省空间#
我需要在Windows Azure中存储布尔数据。我想让这些占据的空间尽可能小。我有大约15个字段,它们的值为真或假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来遍历字段名 不用麻烦了。您使用的是布尔值,它已
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);
}