字节测试c#

Byte testing c#

我有一个数据采集模块。 return一个字节的每一位都是1.

示例:
- 字节:9
- 0000 1001

而且我想知道如何查看每个位是否为 1。

有人告诉我执行“9 & 1”以查看第一位是否为 1,但它不起作用。还是我用的不好

for(int i = 1; i<=5 ;i ++)
{
    if((portData2 & i) == 1)
    {
        switch(i)
        {
            case 1:
                IN0D.Text = 1.ToString();
                break;
            case 2:
                IN1D.Text = 1.ToString();
                break;
            case 3:
                IN2D.Text = 1.ToString();
                break;
            case 4:
                IN3D.Text = 1.ToString();
                break;
            case 5:
                IN4D.Text = 1.ToString();
                break;
        }
    }
}

要测试字节中是否设置了位,可以像这样使用 & 运算符:

if ((b & 1) > 0)
{
    // Bit 0 is set
}
if ((b & 2) > 0)
{
    // Bit 1 is set
}
if ((b & 4) > 0)
{
    // Bit 2 is set
}

等等。

请注意:

Bit to test:    7   6   5   4   3   2   1   0
Value for &:  128  64  32  16   8   4   2   1

你会注意到 & 的值总是 2 ^ xx 是你要检查的位的索引,你可以写成 1 << x 在 C# 中。所以下面的扩展方法可以测试一个字节中的任意位:

public static bool IsBitSet(this byte b, int bitIndex)
{
    if (bitIndex < 0 || bitIndex > 7)
        throw new ArgumentException("bitIndex must be between 0 and 7!");

    var bit = 1 << bitIndex;
    return (b & bit) > 0;
}

牢记以上内容,您可以像这样重写代码:

for(int i = 0; i <= 5; i++)
{
    if ((portData2 & (1 << i)) > 0)
    {
        switch(i)
        {
            case 0:
                IN0D.Text = "1";
                break;
            case 1:
                IN1D.Text = "1";
                break;
            case 2:
                IN2D.Text = "1";
                break;
            case 3:
                IN3D.Text = "1";
                break;
            case 4:
                IN4D.Text = "1";
                break;
        }
    }
}

或者使用我上面没有循环的扩展方法:

IN0D.Text = portData2.IsBitSet(0) ? "1" : "0";
IN1D.Text = portData2.IsBitSet(1) ? "1" : "0";
IN2D.Text = portData2.IsBitSet(2) ? "1" : "0";
IN3D.Text = portData2.IsBitSet(3) ? "1" : "0";
IN4D.Text = portData2.IsBitSet(4) ? "1" : "0";

请注意 1.ToString() 就是 "1"。为什么要把事情搞复杂?