我对C#(以及通常的C)非常陌生。我从外部源返回一个字节值,表示IO设备端口上8个输入引脚的状态,所以我得到了一个值0-255表示端口上存在的二进制模式。
如何删除各个位并将它们设置为bool变量,所以做这样的事情:
if (inputBuffer[1] == 1)
{
IO.Input0 = true;
IO.Input1 = false;
IO.Input2 = false;
IO.Input3 = false;
IO.Input4 = false;
IO.Input5 = false;
IO.Input6 = false;
IO.Input7 = false;
}
我可能过度解释了我想要实现的目标,但认为这给出了最好的例子,虽然非常不切实际,但我怎样才能更好地实现这一点来设置基于字节值0-255的变量。
答案 0 :(得分:12)
使用按位和(&
)。假设Input0
表示最低有效位:
IO.Input0 = (inputBuffer & 0x01) == 0x01;
IO.Input1 = (inputBuffer & 0x02) == 0x02;
IO.Input2 = (inputBuffer & 0x04) == 0x04;
IO.Input3 = (inputBuffer & 0x08) == 0x08;
IO.Input4 = (inputBuffer & 0x10) == 0x10;
IO.Input5 = (inputBuffer & 0x20) == 0x20;
IO.Input6 = (inputBuffer & 0x40) == 0x40;
IO.Input7 = (inputBuffer & 0x80) == 0x80;
您还可以实现如下扩展方法:
public static bool IsBitSet(this byte b, int bit)
{
if(bit < 0 || bit > 7)
throw new ArgumentOutOfRangeException("bit must be between 0 and 7");
byte bitToCheck = (byte)(0x01 << bit);
return (b & bitToCheck) == bitToCheck;
}
然后你可以这样称呼:
IO.Input4 = inputBuffer.IsBitSet(4);
答案 1 :(得分:4)
使用位掩码和&
- 运算符来解决这个问题
byte b = 100;
if(b&1 == 1) { } //bit 1 is set
if(b&2 == 2) { } //bit 2 is set
if(b&4 == 4) { } //bit 3 is set
...
答案 2 :(得分:2)
我认为自编课可以提供帮助。类可以包含8位,构造函数需要一个字节。在构造函数中,您可以计算单个位。
public class myByte
{
bool Input0 = false;
bool Input1 = false;
bool Input2 = false;
bool Input3 = false;
bool Input4 = false;
bool Input5 = false;
bool Input6 = false;
bool Input7 = false;
public myByte(byte b)
{
//written by Ic.
Input0 = b & 0x01 == 0x01;
Input1 = b & 0x02 == 0x02;
Input2 = b & 0x04 == 0x04;
Input3 = b & 0x08 == 0x08;
Input4 = b & 0x10 == 0x10;
Input5 = b & 0x20 == 0x20;
Input6 = b & 0x40 == 0x40;
Input7 = b & 0x80 == 0x80;
}
... //getter setter ...
}
答案 3 :(得分:2)
你可以这样做。
int x= inputBuffer[1];
bit1 = ((x>>7)&1==1);
bit2 = ((x>>6)&1==1);
bit3 = ((x>>5)&1==1);
bit4 = ((x>>4)&1==1);
bit5 = ((x>>3)&1==1);
bit6 = ((x>>2)&1==1);
bit7 = ((x>>1)&1==1);
bit8 = (x&1==1);
要从11101110值获得第1位,您需要先右移bt 7次,然后使用1进行AND操作将告诉您该值是1还是0,同样的解决方案也适用于其他位。
答案 4 :(得分:2)
如果以字节形式向您提供数据并且每个位都已被屏蔽,那么我会保持原样。将它们转换为另一种类型是不必要的,这将是一项额外的工作,没有任何好处。要获得正确的位,只需使用位掩码模式
private bool GetMaskedBit(var inputBuffer , int mask)
{
return ((inputBuffer & mask) != 0);
}
通过这种方式,您可以解析缓冲区和所需的位,这将返回该位是否已设置。
答案 5 :(得分:2)
您可以使用BitArray
类。
var bitArray = new BitArray(inputBuffer);
IO.Input1 = bitArray[byteIndex * 8 + 1];
或者
var bitArray = new BitArray(new byte[] { inputBuffer[1] });
IO.Input1 = bitArray[1];
您也可以将其作为布尔值的集合进行迭代,并对整个集合执行按位运算。
它显然不如此处提供的其他选项(分配成本)那样高效,但它确实为位计算提供了非常巧妙的API。