2.5.位运算实战演练2--技术升级:用宏定义来完成位运算
来源:互联网 发布:相机cf卡数据恢复 编辑:程序博客网 时间:2024/06/08 11:43
2.5.技术升级:用宏定义来完成位运算
直接用宏来置位、复位(最右边为第1位),我们先来看看最终结果是什么样的,然后我们再来一步一步的分析
// 把x的第n位置一 #define SET_NTH_BIT(x, n) (x | ((1U)<<(n-1)))//把x的第n位清零 #define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1)))//把x的n-m位置一 #define SET_BIT_N_M(x,n,m) (x|((~((~0U)<<(m-n+1)))<<(n-1)))//把x的n-m位读取出来 #define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))
1.第一题:使用宏定义将32位数x的第n位置一(右边第一位,第n位代表bitn-1,比如,第一位就是bit0)
分析:
第一步:置一使用位或 |
第二步:第n位置一,先在最低位构建1,然后左移n-1位
第三步:构建的特定数与原来的x位或
#include<stdio.h>#define SET_BIT_N(x,n) (x | (1U<<(n-1)))int main(void){ unsigned int x = 0; //x的初始值 unsigned int b = 0; b = SET_BIT_N(x,4); //宏得到的结果赋值给b printf("b = 0x%x\n",b); // b = 0x8 二进制数0000 1000}
2.第二题:使用宏定义将32位数x的第n位清零(右边第一位,第n位代表bit n-1
分析:
第一步:清零用位与
第二步:第n位清零,第n位是0,其他位是1,1多0少使用位取反
第三步:构建的特定数与原来的x位与
#include<stdio.h>#define CLEAR_BIT_N(x,n) (x & ~(1U<<(n-1)))int main(void){ unsigned int x = 0xff; //x的初始值 unsigned int b = 0; b = CLEAR_BIT_N(x,4); //宏得到的结果赋值给b printf("b = 0x%x\n",b); // b = 0xf7 1111 1011}
3.第三题:使用宏定义将32位数x的第n位到第m位置一(n是低位,m是高位)比如 n = 3,m =6
分析:
第一步:置一用位或
第二步:bit n - bit m一共有 (m-n+1)个位
第三步:左移(m-n+1)位之后,得到了(m-n+1)个0,要再取反
第四步:左移n-1位
#include<stdio.h>#define SET_BIT_N_M(x,n,m) (x|((~((~0U)<<(m-n+1)))<<(n-1)))int main(void){ unsigned int x = 0; unsigned int b = 0; b = SET_BIT_N_M(x,1,4); // b = SET_BIT_N_M(x,5,8); // 第5-8位置一,b = 0xf0 printf("b = 0x%x\n",b); //第1-4位置一,b = 0xf}
4.第四题:截取变量的部分连续位。例如:变量0x88,也就是10001000b,若截取第2~4位,则值为:100b = 4
#define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))
分析:
第一步:保留第2位-第4位,也就是bit1-bit3
第二步:得到一个特定数bit1-bit3为1,其他位是0,与原来的数进行位或
~(0U) // 32位1
~(0U)<<(m-n+1) //得到(m-n+1)个1(最低位开始)
~(~(0U)<<(m-n+1)) //得到(m-n+1)个0(最低位开始)
~(~(0U)<<(m-n+1))<<(n-1) //得到bit(n-1)-bit(m-1)是0
(x & ~(~(0U)<<(m-n+1))<<(n-1)) //和原来的数进行位与
((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)) //移位到最低位进行读取
第三步:将位或之后的数右移到最低位,读出
#include<stdio.h>#define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)) int main(void){ unsigned int x = 0x88; //1000 1000 unsigned int b = 0; b = GETBITS(x,2,4); printf("b = 0x%x\n",b); //b = 0x4}
总结:位运算总算是告一段落了,总共6节课,我学了四遍,只要掌握了上面讲的位运算,就可以应对百分之八九十的情况,对于宏定义,不要求自己可以完全写出来,只要理解为什么这么写就行,千万别去记宏定义算式,要注意总结和分析,这也是我一直注重的能力。接下来该开始学习c语言的3.指针部分了,感谢朱老师的课程, 欢迎大家一起来学习,QQ群:373221403 视频下载地址:http://8b5d49.l69.yunpan.cn/lk/cjVy3RAgfDufK 访问密码:4ad7
- 2.5.位运算实战演练2--技术升级:用宏定义来完成位运算
- 19.位运算实战演练
- 用宏定义来完成位运算(置位,复位,截取)
- 用宏定义来完成位运算及复杂宏定义的解析方法
- 2.4.位运算实战演练1
- 宏定义与位运算
- 宏定义,条件编译,共用体,位运算,位域
- 位运算(实战篇)
- 来谈谈C++ 位运算 & | << >> ^ ~ %
- 来谈谈C++ 位运算 & | << >> ^ ~ %
- 来谈谈C++ 位运算 & | << >> ^ ~ %
- 来谈谈C++ 位运算 & | << >> ^ ~ %
- 来谈谈C++ 位运算 & | << >> ^ ~ %
- 位运算来实现加法运算
- 2.5、位运算分析
- 位运算用例
- 位运算应用2
- 位运算(2)
- C语言和c++中的const、static、extern
- 矩阵维度与通道
- 剑指Offer----面试题13:在O(1)时间删除链表结点
- iOS实践:天气App
- .balignl 16,0xdeadbeef浅析
- 2.5.位运算实战演练2--技术升级:用宏定义来完成位运算
- leetcode-Java-18. 4Sum
- 任意进制整数之间的相互转换(C++实现)
- Android WebView 加载横向进度条
- ROS中 package.xml CMakeList.txt launch文件
- rar
- 微信公众号开发--消息的接收与被动回复消息
- Android高级图片滚动控件,编写3D版的图片轮播器
- PAT Basic Level 1052. 卖个萌