移位操作:指定位置 0 或者置 1 时间: 2019-01-08 14:28 分类: JAVA ####前言 最近在实现 JT/T 808 协议设备参数查询与修改时,发现一些参数是用位来控制的,其实这种操作在单片机里面是非常常见的了,所以掌握某位置 0 或者置 1 的位操作还是有必要的。 ####分析 例如一个 short 字段存储了 16 个功能的开关(1 个 short 占两个字节,一个字节占 8 位,所以可以用作16个功能的开关)。 假设该字段的值为 13,那么它的二进制如下: > 0000 0000 0000 1101 那么它代表的是 1、3、4 位上开关是打开的,现有需求不改变其它开关的状态下把第二位上的开关打开,即:第二位置 1 操作。 实现很简单,我们可以借助 1 的移位操作来实现: 1. 第二位的开关,所以 1 << 2 得到 0000 0000 0000 0010 2. 将上面的结果与原来的值进行或操作 即: ``` 0000 0000 0000 1101 或 0000 0000 0000 0010 ------------------- 0000 0000 0000 1111 ``` 我们都知道`或操作`是只要有一个`1`则为`1`,所以上面的操作正好能够不影响其它位的值把第二位置 1,而其它位`或0`操作得到的也是原来的值。 再有需求将上面字段的第四位置 0,即:把第四位的开关关闭。 与上面类似,也是借助 1 的移位操作来实现: 1. 1 << 4 得到 0000 0000 0000 1000 2. 将上面的结果取反得到 1111 1111 1111 0111 3. 将取反的结果与原来的值进行与操作 即: ``` 1111 1111 1111 0111 与 0000 0000 0000 1101 ------------------- 0000 0000 0000 0101 ``` 我们都知道`与操作`是要两个同时为`1`才为`1`,所以上面的操作正好能够不影响其它位的值把第四位置 0,而其它位`与1`操作得到的也是原来的值。 ####总结 13 的第二位置 1 操作: 13 | (1 << 2) 13 的第四位置 0 操作: 13 & (~(1 << 4)) 标签: 无