字节测试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 ^ x
,x
是你要检查的位的索引,你可以写成 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"
。为什么要把事情搞复杂?
我有一个数据采集模块。 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 ^ x
,x
是你要检查的位的索引,你可以写成 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"
。为什么要把事情搞复杂?