C语言的位操作 |
您所在的位置:网站首页 › 零是一位数还是几位数 › C语言的位操作 |
下面分享关于位操作的一些笔记: 一、位操作简单介绍首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器: 当我们要设置第0位bit0的值为1时,可能会这样进行设置: TEST = 0x01;但是,这样设置是不够准确的,因为这时候已经同时操作到了高7位:bit1~bit7,如果这高7位没有用到的话,这么设置没有什么影响;但是,如果这7位正在被使用,结果就不是我们想要的了。 在这种情况下,我们就可以借用按位操作运算符进行配置。 对于二进制位操作来说,不管该位原来的值是0还是1,它跟0进行&运算,得到的结果都是0,而跟1进行&运算,将保持原来的值不变;不管该位原来的值是0还是1,它跟1进行|运算,得到的结果都是1,而跟0进行|运算,将保持原来的值不变。 所以,此时可以设置为: TEST = TEST | 0x01;其意义为:TEST寄存器的高7位均不变,最低位变成1了。在实际编程中,常改写为: TEST |= 0x01;这种写法可以一定程度上简化代码,是 C 语言常用的一种编程风格。设置寄存器的某一位还有另一种操作方法,以上的等价方法如: TEST |= (0x01 > 0) & 0x000000ff) /* 获取第0个字节 */ #define GET_LOW_BYTE1(x) ((x >> 8) & 0x000000ff) /* 获取第1个字节 */ #define GET_LOW_BYTE2(x) ((x >> 16) & 0x000000ff) /* 获取第2个字节 */ #define GET_LOW_BYTE3(x) ((x >> 24) & 0x000000ff) /* 获取第3个字节 */示例: (2)获取某一位: #define GET_BIT(x, bit) ((x & (1 > bit) /* 获取第bit位 */示例: (1)清零某个字节: #define CLEAR_LOW_BYTE0(x) (x &= 0xffffff00) /* 清零第0个字节 */ #define CLEAR_LOW_BYTE1(x) (x &= 0xffff00ff) /* 清零第1个字节 */ #define CLEAR_LOW_BYTE2(x) (x &= 0xff00ffff) /* 清零第2个字节 */ #define CLEAR_LOW_BYTE3(x) (x &= 0x00ffffff) /* 清零第3个字节 */示例: (2)清零某一位: #define CLEAR_BIT(x, bit) (x &= ~(1 ODR |= 1 ODR &= ~(1 ODR, 10); /* PA10输出高(置1操作) */ CLEAR_BIT(GPIOA->ODR, 10); /* PA10输出低(清0操作) */方法二: GPIOA->ODR |= (uint16_t)0x0400; /* PA10输出高(置1操作) */ GPIOA->ODR &= ~(uint16_t)0x0400; /* PA10输出低(清0操作) */貌似第二种方法更麻烦?还得去细心地去构造一个数据。 但是,其实第二种方法其实是ST推荐我们用的方法,为什么这么说呢?因为ST官方已经把这些我们要用到的值给我们配好了,在stm32f10x.h中: 这个头文件中存放的就是外设寄存器的一些位配置。 所以我们的方法二等价于: GPIOA->ODR |= GPIO_ODR_ODR10; /* PA10输出高(置1操作) */ GPIOA->ODR &= ~GPIO_ODR_ODR10; /* PA10输出低(清0操作) */两种方法都是很好的方法,但方法一似乎更好理解。 配置连续几位的方法也是一样的,就不介绍了。简单介绍配置不连续位的方法,以TIM1的CR1寄存器为例: 设置CEN位为1、设置CMS[1:0]位为01、设置CKD[1:0]位为10: TIM1->CR1 |= (0x1 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |