Posted on 

C语言位操作

  • #define Bit(i) (0x01<<i)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33



    - [C语言按位清0和置1操作(位运算符合移位运算符组合)\_位运算清零-CSDN博客](https://blog.csdn.net/changyi9995/article/details/109251325)

    ![C语言 | 嵌入式位操作精华技巧汇总_编程开发](https://cdn.jsdelivr.net/gh/qiaorunpu/blog-img/img/202312271450119.webp)





    # 异或操作

    > [史上最通俗易懂的异或运算详解【含例题及应用】-CSDN博客](https://blog.csdn.net/weixin_43899069/article/details/121048025?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-121048025-blog-9025535.235^v39^pc_relevant_yljh&spm=1001.2101.3001.4242.1&utm_relevant_index=1)





    # 与 或

    > [C语言 | 嵌入式位操作精华技巧汇总\_51CTO博客\_嵌入式c语言基础](https://blog.51cto.com/u_15244533/2845299)



    - 与1相或,置1

    ```c
    TEST = TEST | 0x01;
    //第几位要置1就左移几位。
    TEST |= (0x01 << n);
    GPIOA->ODR |= (uint16_t)0x0400; /* PA10输出高(置1操作) */

  • 与0相与,置0

1
2
3
TEST &= 0xF0;
GPIOA->ODR &= ~(1 << 10); /* PA10输出低(清0操作) */
GPIOA->ODR &= ~(uint16_t)0x0400; /* PA10输出低(清0操作) */

二、嵌入式中位操作一些常见用法

1、一个32bit数据的位、字节读取操作

(1)获取单字节:

1
2
3
4
#define	GET_LOW_BYTE0(x)	((x >>  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)获取某一位:

1
#define	GET_BIT(x, bit)	((x & (1 << bit)) >> bit)	/* 获取第bit位 */

2、一个32bit数据的位、字节清零操作

(1)清零某个字节:

1
2
3
4
#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)清零某一位:

1
#define	CLEAR_BIT(x, bit)	(x &= ~(1 << bit))	/* 清零第bit位 */

3、一个32bit数据的位、字节置1操作

(1)置某个字节为1:

1
2
3
4
#define	SET_LOW_BYTE0(x)	(x |= 0x000000ff)	/* 第0个字节置1 */	
#define SET_LOW_BYTE1(x) (x |= 0x0000ff00) /* 第1个字节置1 */
#define SET_LOW_BYTE2(x) (x |= 0x00ff0000) /* 第2个字节置1 */
#define SET_LOW_BYTE3(x) (x |= 0xff000000) /* 第3个字节置1 */

(2)置位某一位:

登录后复制

1
#define	SET_BIT(x, bit)	(x |= (1 << bit))	/* 置位第bit位 */