为什么可以';我不能在c#中定义一个位吗?
为什么C#中没有位结构?它被称为布尔结构。至少,它会起到基本的作用,对吗?在C#中,您不需要经常旋转位(至少我不需要),如果需要,您可以使用内置操作 那里有一个类。如果你有一个位标志集合,那么使用枚举(带有falgs属性)和整数会有很长的路要走。你想用它做什么?请记住,CLR不会试图将多个变量打包到一个字节中,因此单独使用一个变量并不比布尔值更有用。如果你想收集它们——正如大卫所指出的,这就是目的为什么可以';我不能在c#中定义一个位吗?,c#,c#-7.0,C#,C# 7.0,为什么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)位在某些上下文中是单独出现的,例如在表示单个微处理器时