智能网联服务器在汽车远程控制的探索 6(C#位运算符 &、|、~)

上篇文章中,介绍了高低位的运算方式,高位乘以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向左位移四位,再取反的办法。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值