为什么C#中没有一点结构?
答案 0 :(得分:19)
值得一提的是,这是一个完整的位结构,包括int
和bool
转换和算术运算。可能不完美,但对我来说效果很好。享受!
/// <summary>
/// Represents a single bit that can be implicitly cast to/from and compared
/// with booleans and integers.
/// </summary>
/// <remarks>
/// <para>
/// An instance with a value of one is equal to any non-zero integer and is true,
/// an instance with a value of zero is equal to the integer zero and is false.
/// </para>
/// <para>
/// Arithmetic and logical AND, OR and NOT, as well as arithmetic XOR, are supported.
/// </para>
/// </remarks>
public struct Bit
{
/// <summary>
/// Creates a new instance with the specified value.
/// </summary>
/// <param name="value"></param>
public Bit(int value) : this()
{
Value = value == 0 ? 0 : 1;
}
/// <summary>
/// Gets the value of the bit, 0 or 1.
/// </summary>
public int Value { get; private set; }
#region Implicit conversions
public static implicit operator Bit(int value)
{
return new Bit(value);
}
public static implicit operator int(Bit value)
{
return value.Value;
}
public static implicit operator bool(Bit value)
{
return value.Value == 1;
}
public static implicit operator Bit(bool value)
{
return new Bit(value ? 1 : 0);
}
#endregion
#region Arithmetic operators
public static Bit operator |(Bit value1, Bit value2)
{
return value1.Value | value2.Value;
}
public static Bit operator &(Bit value1, Bit value2)
{
return value1.Value & value2.Value;
}
public static Bit operator ^(Bit value1, Bit value2)
{
return value1.Value ^ value2.Value;
}
public static Bit operator ~(Bit value)
{
return new Bit(value.Value ^ 1);
}
public static Bit operator !(Bit value)
{
return ~value;
}
#endregion
#region The true and false operators
public static bool operator true(Bit value)
{
return value.Value == 1;
}
public static bool operator false(Bit value)
{
return value.Value == 0;
}
#endregion
#region Comparison operators
public static bool operator ==(Bit bitValue, int intValue)
{
return
(bitValue.Value == 0 && intValue == 0) ||
(bitValue.Value == 1 && intValue != 0);
}
public static bool operator !=(Bit bitValue, int intValue)
{
return !(bitValue == intValue);
}
public override bool Equals(object obj)
{
if(obj is int)
return this == (int)obj;
else
return base.Equals(obj);
}
#endregion
}
答案 1 :(得分:16)
它被称为布尔值。至少,它会起到基本作用,对吧?你不会经常在C#中旋转比特(至少,我没有),如果你需要,你可以使用内置的操作。
答案 2 :(得分:15)
是一个BitArray类..
答案 3 :(得分:9)
你想用它做什么?请记住,CLR不会尝试将多个变量打包到一个字节中,因此单独使用一个变量并不比布尔值更有用。如果你想拥有它们的集合 - 嗯,就像大卫指出的那样BitArray就是这样。
如果我们确实有一个比特结构,我怀疑人们会期望多个比特变量被有效地打包在内存中 - 首先没有类型,我们避免这种期望并带领人们其他解决方案,如BitArray。
答案 4 :(得分:3)
如果你有一组位标志,那么使用枚举(带有falgs属性)和整数可以很长时间。
答案 5 :(得分:2)
虽然可能有极少数例外,但计算机并非设计或打算用于操作或分配单个位。即使在最低级别(汇编语言或纯机器语言),您也无法分配或访问单个位。在这方面,您可以使用与任何编程级别相同的工具:字节和按位操作。
答案 6 :(得分:2)
除了已经提到的BitArray类之外,还有一个效率更高的BitVector32 Structure。
BitVector32比布尔值和BitArray更有效 内部使用的小整数。 BitArray可以增长 无限期地根据需要,但它具有内存和性能开销 类实例需要的。相反,BitVector32仅使用 32位。
请注意,您只能使用32个值。
答案 7 :(得分:1)
您现在可以在C#7.0中执行此操作!
public const int One = 0b0001;