上篇文章中,介绍了高低位的运算方式,高位乘以256再加低位得出最终的数值,除此之外我们还可以利用C#里位运算符'<<'和'>>'进行位移运算,<<是向左(高位)位移,>>是向右(低位)位移。
实例代码如下:
internal static int ConvertToInt(byte ab, byte bb)
{
byte[] list_bytes = { ab, bb };
return ((list_bytes[0] << 8) + list_bytes[1]);
}
internal static byte[] ConvertToByte(int account)
{
byte[] head = new byte[2];
head[0] = (byte)(account >> 8);
head[1] = (byte)(account & 0xFF);
return head;
}
还有一类问题,如果一共有八个灯,它们都处于熄灭状态,二进制表示就是0000 0000,我们现在需要开启第五个LED灯,也就是0001 0000,怎么实现0000 0000 到 0001 0000的转换呢?
第一种思路是这样,首先把灯的状态转换为二进制的字符串,string result = Convert.ToString(0x00, 2);
result 的值为“00000000”表示八个灯全部关闭状态,此时要修改第五个LED等的状态在字符串中索引是3,数值改为'1',result[3]="1";最后,我们再把修改后的二进制字符串,转换为可以使用的十六进制字符发送到服务器,完成对设备的操作。string ledComm= Convert.ToString(0x10, 2);
//从服务器获取灯的状态,并转换为二进制的字符串,
string result = Convert.ToString(0x00, 2);
//修改第五个LED等的状态,(索引是3)
result.Remove(3);
result.Insert(3, "1");
//二进制字符串转换成byte字符后
string ledComm = Convert.ToString(0x10, 2);
//发送给服务器控制LED灯的开关....
注意,二进制字符串中,C#修改的索引值是从左向右0至length-1,而控制Led灯的索引值是从右向左。
第二种思路是这样,文章开头我们提到了位运算符<<和>>表示向左(高位)位移和向右(低位)位移。位运算符中还包含按位与和按位或,分别是"&"和"|"。
当两个字符进行"&"运算时,两个字符会转换为二进制进行比较,第一位两个同为1时,得出结果的第一位是1。再比较第二位,同为1,结果为1,反之如果只有有一位为1或都不为1,则结果为0,以此类推其他位。
当两个字符进行"|"运算时,两个字符会转换为二进制进行比较,第一位比较有一个为1时,得出结果的第一位是1。再比较第二位,有一位为1,结果为1,反之如果同为0,则结果为0,以此类推其他位。
实例代码如下:
byte a = 0x10; //0001 0000
byte b = 0x02; //0000 0010
byte c = Convert.ToByte(a & b); //0000 0000
byte d = Convert.ToByte(a | b); //0001 0010
byte e = Convert.ToByte(a & a); //0001 0000
所有,当我们修改二进制字符串中的某个值时,其实不需要转换成字符串,然后修改字符串,我们只需要用"<<"位移到响应的位置,在利用"&"和"|"来修改对应的数值,距离说明,如果我们把0000 0000的第五位改成1,我们把1位移到第五位,然后利用"|"字符有一方为1结果便是1的规则进行运算,同理,如果我们把1111 1111的第五位改成0,我们把0位移到第五位,然后利用"&"字符有一方为0结果便是0的规则进行运算。
示例代码如下:
byte a = 0x00; //0000 0000
byte b = 0xFF; //1111 1111
byte c = Convert.ToByte(a | (1 << 4)); //0001 0000
byte e = Convert.ToByte((1 << 4)); //0001 0000
byte d = Convert.ToByte(b & ~e); //1110 1111
这里的 ~e是对字符按位取反,暨0变成1,1变成0。如果直接把0向左位移四位0<<4,结果还是0,所有我们把1向左位移四位,再取反的办法。