C语言学习笔记_位运算

C语言学习笔记_位运算

知识点记录

基本位运算

按位与:全1为1,见0为0;与1相与无变化,与0相与变为0;可用于特定位清零

按位或:见1为1,全0为0;与1相或变为1,与0相或无变化;可用于特定位置1

异或:相同为0,不同为1;与1异或会取反,与0异或无变化;可用于特定位取反

移位运算

无符号数:左移右侧补0,右移左侧补0

有符号数:左移右侧补0,右移左侧补符号位

构造特定二进制数

unsigned int a, b;
a = (0x1<<3);				//构造二进制数0000 …… 0000 1000
b = (0x1<<3) | (0x1<<6);	//构造二进制数0000 …… 0100 1000

unsigned int c,d;
c = ~(0x1<<3);				//构造二进制数1111 …… 1111 0111
d = ~((0x1<<3) | (0x1)<<6);	//构造二进制数1111 …… 1011 0111

测试

给定一个整形数a,设置a的bit3~bit7,保持其他位不变。

a |= 0x1F<<3;

给定一个整形数a,清除a的bit15~bit23,保持其他位不变。

a &= ~(0x1FF<<15);

给定一个整形数a,取出a的bit3~bit8。

a = (a>>3) & 0x3F;

给一个寄存器的bit7~bit17中的值加17

unsigned int b;				//定义临时变量
b = (a>>7) & 0x7FF;			//获取bit7~bit17中的值
b += 17;					//对原来的值增加17
a &= ~(0x7FF<<7);			//对应位清零
a |= b<<7 ;					//对应位赋值

给一个寄存器的bit7-bit17赋值937,同时给bit21-bit25赋值17。

a &= ~((0x7FF<<7) | (0x1F<<21));		//对应位清零
a |= (937<<7) | (17<<21);				//对应位赋值

用宏定义将32位数x的第n位置位

#define SET_BIT_N(x, n) (x | (1U<<(n-1))) //数字后面加U表示无符号

用宏定义将32位数x的第n位清零

#define CLEAR_BIT_N(x, n) (x & ~(1U<<(n-1)))

用宏定义将32位数x的第n位到第m位置位

#define GET_ALLONE_BITS(n, m)	(~(~(0U)<<(m-n+1)))			//得到m-n+1位全为1的二进制数
#define SET_BIT_N_M(x, n, m)	(x | GET_ALLONE_BITS(n, m)<<(n-1))		//置位

截取变量x的第n到第m位

#define GET_BIT(x, n, m) (x>>(n-1) & GET_ALLONE_BITS(n , m))

posted @ 2020-05-31 20:13  樱花小猪  阅读(381)  评论(0编辑  收藏  举报