为什么可以';我不能在c#中定义一个位吗?

为什么可以';我不能在c#中定义一个位吗?,c#,c#-7.0,C#,C# 7.0,为什么C#中没有位结构?它被称为布尔结构。至少,它会起到基本的作用,对吗?在C#中,您不需要经常旋转位(至少我不需要),如果需要,您可以使用内置操作 那里有一个类。如果你有一个位标志集合,那么使用枚举(带有falgs属性)和整数会有很长的路要走。你想用它做什么?请记住,CLR不会试图将多个变量打包到一个字节中,因此单独使用一个变量并不比布尔值更有用。如果你想收集它们——正如大卫所指出的,这就是目的 如果我们有一个位结构,我怀疑人们会期望多个位变量在内存中被有效地打包-通过首先没有类型,我们避免了

为什么C#中没有位结构?

它被称为布尔结构。至少,它会起到基本的作用,对吗?在C#中,您不需要经常旋转位(至少我不需要),如果需要,您可以使用内置操作

那里有一个类。

如果你有一个位标志集合,那么使用枚举(带有falgs属性)和整数会有很长的路要走。

你想用它做什么?请记住,CLR不会试图将多个变量打包到一个字节中,因此单独使用一个变量并不比布尔值更有用。如果你想收集它们——正如大卫所指出的,这就是目的


如果我们有一个位结构,我怀疑人们会期望多个位变量在内存中被有效地打包-通过首先没有类型,我们避免了这种期望,并引导人们使用其他解决方案,如BitArray。

尽管可能有罕见的例外,计算机的设计或目的不是操纵或分配单个位。即使在最低级别(汇编或纯机器语言),您也无法分配或访问单个位。在这方面,您可以使用与任何编程级别相同的工具:字节和按位操作。

除了前面提到的BitArray类之外,还有一种更有效的方法

对于布尔值和布尔值,BitVector32比BitArray更有效 内部使用的小整数。位数组可以增长 根据需要无限期地执行,但它有内存和性能开销 类实例所需的。相比之下,位向量32仅使用 32位

请记住,您被限制为32个值


值得一提的是,这里有一个完整的位结构,包括
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的实例等于任何非零整数且为true,
///值为零的实例等于整数零且为false。
/// 
/// 
///支持算术和逻辑and、OR和NOT以及算术XOR。
/// 
/// 
公共结构位
{
/// 
///使用指定的值创建新实例。
/// 
/// 
公共位(int值):this()
{
值=值==0?0:1;
}
/// 
///获取位0或1的值。
/// 
公共int值{get;private set;}
#区域隐式转换
公共静态隐式运算符位(int值)
{
返回新位(值);
}
公共静态隐式运算符int(位值)
{
返回值;
}
公共静态隐式运算符bool(位值)
{
返回值。值==1;
}
公共静态隐式运算符位(布尔值)
{
返回新位(值?1:0);
}
#端区
#区域算术运算符
公共静态位运算符|(位值1,位值2)
{
返回值1.值|值2.值;
}
公共静态位运算符&(位值1,位值2)
{
返回值1.值和值2.值;
}
公共静态位运算符^(位值1,位值2)
{
返回值1.值^value2.值;
}
公共静态位运算符(位值)
{
返回新位(value.value^1);
}
公共静态位运算符!(位值)
{
返回~值;
}
#端区
#真假算子的区域划分
公共静态布尔运算符真(位值)
{
返回值。值==1;
}
公共静态布尔运算符false(位值)
{
返回值。值==0;
}
#端区
#区域比较运算符
公共静态布尔运算符==(位位值,int值)
{
返回
(bitValue.Value==0&&intValue==0)|
(bitValue.Value==1&&intValue!=0);
}
公共静态布尔运算符!=(位位值,int值)
{
返回!(bitValue==intValue);
}
公共覆盖布尔等于(对象对象对象)
{
if(obj为int)
返回this==(int)obj;
其他的
返回基数等于(obj);
}
#端区
}
您现在可以在C#7.0中执行此操作

公共常数int One=0b0001


布尔值的大小通常不是一位。确实,它们的大小是由实现定义的。这并不意味着它不能达到同样的目的。@JasperBekkers好吧,你不能真正处理内存中的单个位。存在内存对齐和填充的问题。是的,如果您有许多位,您可以有效地表示它们,但这正是
位数组
的用途。@luan您是正确的,大多数硬件不会像那样加载/存储单个位-但是您仍然可以用单个位表示信息。或者把很多东西打包在一起。尽管布尔值只表示一个位的信息,但它们的物理大小却不是。@JasperBekkers:但你不能单独在内存中寻址单个位,但这就是为什么空间问题是无效的。虽然它不使用1位的内存,但它使用4个字节,因为你所做的一切都是围绕一个int进行的。我从来没有说过这会占用1位内存。它只代表1位。我仍然不明白那些反对票。我把这个问题理解为暗示为什么一个人不是天生的。也许这就是为什么有些人会投反对票?答案是比特永远不会孤立出现,维护命名比特索引的效率非常低。位将始终包含在数字原语中,您可以完全访问各个位和全范围的位运算符。@RickO'Shea 1)位在某些上下文中是单独出现的,例如在表示单个微处理器时