泽果锅

C语言-位运算操作练习
口诀:与1位或|变成1(置位);与0位与&变成0(清零);取反可用位异或^;~和<< >>...
扫描右侧二维码阅读全文
26
2019/02

C语言-位运算操作练习

口诀:与1位或|变成1(置位);与0位与&变成0(清零);取反可用位异或^;~和<< >>用来构造特定二进制数

1、给定一个整型数a,设置a的bit3,保证其他位不变。

a | =(1 << 3)

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

a | = 0x1f << 3)

3、给定一个整型数a,清除a的bit15,保证其他位不变。

a & = (~ (1 << 15))

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

a & = (~ (0x1ff << 15))

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

a=(a&(0x3f << 3))>>3

6、用C语言给一个寄存器的bit7~bit17赋值937(其余位不受影响)。

a & =~(0x7ff << 7)
a | =937 << 7

7、用C语言将一个寄存器的bit7~bit17中的值加17(其余位不受影响)。
关键点:不知道原来的值是多少
思路:
第一步,先读出原来bit7~bit17的值
第二步,给这个值加17
第三步,将bit7~bit17清零
第四步,将第二步算出来的值写入bit7~bit17

temp = a & (0x7ff << 7)
temp >> = 7
temp + =17
a & =~(0x7ff << 7)
a | = temp << 7

8、用C语言给一个寄存器的bit7~bit17赋值937,同时给bit21~bit25赋值17.

a &= ~((0x3ff<<7) | (0x1f<<21))
a |= ((937<<7) | (17<<21))

9、用宏定义将32位数X的第n位(右边起算,也就是bit0为第一位)置位

# define   SET_BIT_N(x, n)             (x | (1U << (n-1))) //1U表示无符号1,对右移时起作用。

10、用宏定义将32位数X的第n位(右边起算,也就是bit0为第一位)清零

# define   CLEAR_BIT_N(x, n)             (x & (~(1U << (n-1)))) //1U表示无符号1,对右移时起作用。

11、用宏定义将32位数x的第n位到第m位(右边起算,也就是bit0算第1位,m是高位)置位
比如:n=2 m=8,就是把bit1到bit7位置位
我们需要一个算式来得到(m-n+1)个1
算法:第1步:先得到32位1: ~0U
第2步:将第1步得到的数右移x位即可得到(m-n+1)个1 (~0U)>>(32-(m-n+1))

# define   SET_BIT_N_M(x,n,m)     (x | (~((~0U)<<(m-n+1))<<(n-1)) )

12、截取变量的部分连续位。例如:变量0x88, 也就是10001000b,若截取第2~4位,则值为:100b = 4

# define   GET_BIT_N_M(x,n,m)     (x &~( ((~0U)<<(m-n+1))<<(n-1) )) >> (n-1)
最后修改:2019 年 02 月 26 日 11 : 52 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论