C# 检查位以优雅的方式打开

C# 检查位以优雅的方式打开,c#,C#,为了检查hihest位是否为on,我使用代码: byte data = 0x88 ; bool is_on= ((data & 0x80) == 0x80); 如何以更优雅的方式实现这一点?公共静态bool Get(字节b,int位置) { 如果(位置>7) 抛出新ArgumentException(); return((b&(byte)(1因为您正在检查位,所以我唯一可以做的事情就是写出文本,这样您就可以查看各个位,如下所示: int mask = 0b1000_0000; byt

为了检查hihest位是否为on,我使用代码:

byte data = 0x88 ;
bool is_on= ((data & 0x80) == 0x80);
如何以更优雅的方式实现这一点?

公共静态bool Get(字节b,int位置)
{
如果(位置>7)
抛出新ArgumentException();

return((b&(byte)(1因为您正在检查位,所以我唯一可以做的事情就是写出文本,这样您就可以查看各个位,如下所示:

int mask = 0b1000_0000;

byte data = 0x88 ;
bool is_on= ((data & mask) == mask);
int mask = 0b1000_0000;

byte data = 0x88 ;
bool is_on = data.MatchesMask(mask);
我可以进一步将其抽象为一种方法:

public static bool MatchesMask(this int data, int mask)
{
    return (data&mask)==mask;
}
所以我可以这样称呼它:

int mask = 0b1000_0000;

byte data = 0x88 ;
bool is_on= ((data & mask) == mask);
int mask = 0b1000_0000;

byte data = 0x88 ;
bool is_on = data.MatchesMask(mask);

如果您正在处理位设置并考虑一些辅助类来帮助您,请查看

> <代码>标志>代码>结构 用法 您可以使用掩码来初始化
标志
,或者设置特定位
标志=Flag.bit(5)

使用
flag.Get(value)
轮询位,然后使用
value=flag.set(value);
将位设置为1,使用
value=flag.set(value,false);
将位设置为0

测试输出 代码
公共结构标志
{
只读字节掩码;
公共标志(字节掩码)
{
这个。面具=面具;
}
公共字节掩码=>this.Mask;
公共静态标志位(int位置)
=>新标志((字节)(1个新标志(掩码);
公共bool Get(字节值)=>(值和掩码)!=0;
公共字节集(字节值,布尔位=真)
{
如果(位)
{
返回(字节)(值|掩码);
}
其他的
{
返回(字节)(值和掩码);
}
}
}
静态类程序
{
公共静态字符串Bin(此字节数据)
=>Convert.ToString(数据,2).PadLeft(8,'0');
静态void Main(字符串[]参数)
{
字节值=0xB3;
Flag=0x20;
//或者说是活生生的
//var flag=flag.Bit(6);//掩码=0b0010000
WriteLine($“{Bin(value)}&{Bin(flag.Mask)}={flag.Get(value)}”);
//未将位设置为0
value=flag.Set(值,false);
WriteLine($“{Bin(value)}&{Bin(flag.Mask)}={flag.Get(value)}”);
}
}
工具书类

我想你的意思可能是
((data&0x80)=0x80)
。因为你只是测试一个位,而不是多个位,所以可以简化为
(data&0x80)>0
如果需要。在C#中,通常会使用标志枚举,而不是位字段。如果必须使用位字段,则使用低级位操作可能是一种方法:如果需要,可以使用
位数组
,但这是一种过度开销。许多人认为清晰度更重要。这段代码相当于C李尔,在C++中(我想C语言有它),我喜欢隐式转换到BoL,例如,<代码> Boo-ISSOON=Data and 0x80;< /C> >。但是我发现代码审查中我的同龄人认为太…优雅。或者其他东西。他们更喜欢“代码的清晰性”BoOL ISOON =(Data and 0x80)!=0;< /代码>。所以我从他们那里学到了。“我认为C是这样做的”。--不,它不是,因为同样的原因,许多编码标准禁止隐式转换为bool,许多其他语言也禁止,或者至少严格限制,所以我想优雅是旁观者眼中的“优雅”没有在OP中定义。我只想写一次,所以这就是我在代码中所做的。现在,如果你把它作为一个扩展方法,那么bool is_on=data.Get(7);应该是非常愉快的see@Steve:此特定代码在名为
Bit
static
类中定义。因此该调用看起来像
bool result=Bit.Get(b,5);
public struct Flag
{
    readonly byte mask;

    public Flag(byte mask)
    {
        this.mask=mask;
    }

    public byte Mask => this.mask;

    public static Flag Bit(int position)
        => new Flag((byte)(1<<position));
    public static implicit operator byte(Flag bit) => bit.mask;
    public static implicit operator Flag(byte mask) => new Flag(mask);

    public bool Get(byte value) => (value & mask)!=0;
    public byte Set(byte value, bool bit = true)
    {
        if (bit)
        {
            return (byte)(value | mask);
        }
        else
        {
            return (byte)(value & ~mask);
        }
    }
}

static class Program
{
    public static string Bin(this byte data)
        => Convert.ToString(data, 2).PadLeft(8, '0');

    static void Main(string[] args)
    {
        byte value = 0xB3;

        Flag flag = 0x20;
        // or alernativly
        // var flag = Flag.Bit(6); // mask = 0b0010000 
        Console.WriteLine($"{Bin(value)} & {Bin(flag.Mask)} = {flag.Get(value)}");

        // not set the bit to 0
        value = flag.Set(value, false);
        Console.WriteLine($"{Bin(value)} & {Bin(flag.Mask)} = {flag.Get(value)}");
    }
}