关于byte
的一些操作,非常有用的。
1、将byte
转为对应的0/1
数组
不多说,直接看代码:
public static byte[] byteToArray(byte bt)
{
byte[] array = new byte[8];//用于存储每位的值
for(int i = 7; i >= 0; i--)
{
array[i] = (byte)(bt & 1);//强转
bt = (byte)(bt >> 1);//右移1位
}
return array;
}
2、判断byte
最高位的符号
在一些场景中,我们需要一位来确定某个数的符号,通常选用最高位来做符号位,如温度有正负,在保存温度数据时,需要考虑正负,所以采用最高位来作为符号位,设最高位为0
时,温度为正,否则为负。如何判断呢?采用按位与的方法,只需看最高位与1
相与的结果,其他位不管。
我这里采用的方式是,将byte值与0x80
相与,然后与0x80
相比,如果相等,则说明最高位为1
,否则为0
。
代码实现判断最高位
public static byte JudgeTempPositiveOrNegative(byte b)
{
//&是按位与之后的结果,所以最后要和本身【0x80】做比较
if ((b & 0x80) == 0x80)//如果温度最高位是1,即为负数情况
{
Console.WriteLine("最高位为1");
b = (byte)(b & 0x7F);//将b的最高位变为0,其他位不变
Console.Write("最高位已改为0");
return b;
}
else //如果温度最高位是0,为正数,则什么也不做
{
Console.Write("最高位为0");
return b;
}
}
3、分离byte
高低4位
前面用温度举例,现在继续用温度来讲,我们要解析出具体的温度值,如1100 1001
,最高位为1
,为负数,高4位为1100
,数值位为100
,对应十进制值为4
;低4位为1001
,对应十进制值为9
。所以1100 1001
在这种规则下转为十进制数为-49
。
代码实现分离高低4位,并存于数组中
public static int[] SeparatingHighAndLowBits(byte b)
{
int[] HL = new int[2];//一个2位的数组,用于存获取到的高低位值
var high = (b & 0xF0) >> 4;//高位
var low = b & 0x0F;//低位
HL[0] = high;
HL[1] = low;
return HL;//返回数组
}
要实现温度的分离,还需要使用到上面判断最高位符号的代码,这里就不操作了。
4、分离byte
高低4位并求和
在我们传输数据过程中,需要校验,如果采用累加和校验
方式,就要用到分离字节高低4位的方法。
只需要在上面代码中修改部分即可。
public static int SumHighAndLowBits(byte bt)
{
var high = (bt & 0xF0) >> 4;//高位
var low = bt & 0x0F;//低位
return high+low;//返回数组
}