当前位置: 首页 > news >正文

贵州省清镇市建设学校网站如何自己做资源网站

贵州省清镇市建设学校网站,如何自己做资源网站,微信公众号好看的模板哪里找,广州番禺区是富人区吗目录 一、位操作符 1.位与 2.位或| 3.位取反~ 4.位异或^ 5.位与#xff0c;位或#xff0c;位异或的特点总结 6.左移位《《 右移位 》》 二、位与#xff0c;位或#xff0c;位异或在操作寄存器时的特殊作用 1.寄存器操作的要求#xff08;特定位改变而不…目录 一、位操作符 1.位与 2.位或| 3.位取反~ 4.位异或^ 5.位与位或位异或的特点总结 6.左移位《《  右移位   》》 二、位与位或位异或在操作寄存器时的特殊作用 1.寄存器操作的要求特定位改变而不影响其他位 2.特定位清零用 3.特定位置1用| 4.特定位取反用^ 三、用位运算构建特定二进制数 1.寄存器位操作经常需要特定位给特定值 2.使用位移获取特定位为1的二进制数 3.再结合位取反获取特定位为0的二进制数 4.总结 四、位运算实战 1.例题1 2.例题2 3.例题3 4.例题4 5.例题5 6.例题6 7.例题7 8.例题8 方法1 方法2 五、用宏定义完成位运算 1.直接用宏来置位【赋1】复位【赋0】最右边为第1位 1.1 1.2 1.3 2.截取遍历的部分连续位 一、位操作符 1.位与 1位与符号是一个两个是逻辑与 2真值表100   111   000    010 3从真值表可以看出位与操作的特点是只有1和1位于结果为1其余全是0 4位于和逻辑与的区别位与时两个操作数是按照二进制位批次对应位相与的         逻辑与是两个操作数作为整体来相与的举例0xAA0xF00xA0    ,0xAA 0xF01) 2.位或| 1位或符号是一个|两个||是逻辑或 2真值表;1|01 1|11 0|00 0|11 3从真值表可以看出位或时两个操作数是按照二进制彼此对应位相与的                                          逻辑或是两个操作数作为整体来相或的。 3.位取反~ 1C语言中位取反是~C语言中的逻辑取反是 2按位取反是将操作数的二进制位逐个按位取反1变成00变成1         逻辑取反是真在C语言中只要不是0的任何数都是真变成假在C语言中只有0表示假假变成真。 #includestdio.h int main() {int a 45;int b, c;b ~a; //按位取反逐个位操作1变00变1c !a; //按逻辑取反【整体改变】真变假假变真printf(b%d\n, b);//-64printf(c%d\n, c);//0} #includestdio.h int main() {int a 45;int b, c;b ~(~a); //等价于~~ac !(!a); //等价于!!aprintf(b%d\n, b);//45printf(c%d\n, c);//1} 实验;         任何非0的数被按逻辑取反再取反就会得到1         任何非0的数被按位取反再取反就会得到它自己 4.位异或^ 1异或真值表1^10  0^00  1^01  0^11记忆方法2个数如果相等结果为0不等结果为1 //450010 1101//^//230001 0111// 0011 101058unsigned int a 45, b 23;unsigned int c;c a ^ b;//58printf(c%d\n, c); 5.位与位或位异或的特点总结 位与任何数其实就是1和0与1位与无变化与0位于变成0 位或任何数其实就是1和0与1位或变成1与0位或无变化 位异或任何数其实就是1和0与1位异或会取反与0位异或无变化 6.左移位《《  右移位   》》 C语言的位移要取决于数据类型 对于无符号数左移动时右侧补0相当于逻辑移位 对于无符号数右移动左侧补0相当于逻辑移位 对于有符号数。左移时候右侧补0角算术移位相当于逻辑移位 对于有符号数右移动时候左侧补符号位如果整数就0负数就补1叫算术移位 二、位与位或位异或在操作寄存器时的特殊作用 1.寄存器操作的要求特定位改变而不影响其他位 1ARM是内存与IO统一编址的ARM中有很多内部外设SoC中的CPU通过向这些内部外设的寄存器写入一些特定的值来操控逐个内部外设进而操控硬件动作。所以可以说读写寄存器就是操控硬件 2寄存器的特定是按位进行规划和使用。但是寄存器的读写却是整体32位一起进行的。也就是说你只想修改 3寄存器操作要求是:在设定特定位时不能影响其他位。 4如何做到答案是读-改-写三部曲。读改写的操作理念就是当我想改变一个寄存器中某些特定位时我不会直接去给他写我会先读出寄存器整体原来的值然后再逐个基础上修改我想要修改的特定位再将修改后的值整体写入寄存器。这样达到的效果是再不影响其他位原来值的情况下我关心的位的值硬件被修改了。 2.特定位清零用 位与任何数其实就是1和0与1位与无变化与0位于变成0 2如果希望将一个寄存器的某些特定位变成0而不影响其他位可以构造一个合适的1和0组成的数和这个寄存器原来的值进行位与操作就可以将特定位清零 3假设原来32位寄存器中的值为0xaaaa aaaa我们希望将bit8-bit15清零而其他位不变可以将这个数与0xffff 00ff进行位与即可【想要变成0的位直接写上0其他位写1即可】 #includestdio.h int main() {unsigned int a 0xaaaaaaaa;unsigned int b 0xffffffff;unsigned int c;//将想要变成0的位置写上0其他位写上1c a b;printf(c0x%x\n, c);//0xaaaaaaaa } 3.特定位置1用| 位或任何数其实就是1和0与1位或变成1与0位或无变化 2要置1的位写上1其他位为0然后将这个数与相关的数进行位或 //位或特定位置1用|//把寄存器值的bit4-bit7置1其他位不变unsigned int a 0x123d0c57;unsigned int b 0xf0;unsigned int c;c a | b;printf(c0x%x\n, c);//0x123d0cf7 4.特定位取反用^ 位异或任何数其实就是1和0与1位异或会取反与0位异或无变化 2要取反的特定位为1其他位取0然后将这个数与原来的数进行位异或即可。 //异或特定位取反用^//把寄存器值的bit4-bit7取反其他位不变unsigned int a 0x123d0cd7;unsigned int b 0xf0;unsigned int c;c a ^ b;printf(c0x%x\n, c);//0x123d0c27 三、用位运算构建特定二进制数 1.寄存器位操作经常需要特定位给特定值 1由上节课可以找到对寄存器特定位进行置1或者清0或者取反关键性的难点在于要事先构建一个特定的数这个数和原来的值进行位与位或位异或等操作既可达到我们对寄存器操作的要求。 2解法1用工具难度也不大操作起来也不是太麻烦         解法2自己写代码用位操作符号主要是移位和位取反来构建这个特定的二进制数 2.使用位移获取特定位为1的二进制数 1最简单的是用移位来获取一个特定位为1的二进制数。比如我们需要一个bit3-bit7为1隐含意思是其他位全部为0的二进制数可以         1先写出5位为1的数0x1fbit0-bit4)         2然后将这个数左移3位0x1f3》bit3-bit7) 2更难一点的获取bit3-bit7为1同时bit23-bit25为1其他位为0         ((0x1f3) | (0x723)) #includestdio.h int main() {//下面表达式的含义位或说明这个数字由2部分组成第一部分中左移2位说明第一部分从bit3开始//第一部分数字位0x1f说明这部分有5位所以第一部分其实是bit3到bit7//第二部分的解读方法同样的可知第二部其实是bit23到bit25unsigned int a;a ((0x1f 3) | (0x7 23));printf(a0x%x\n, a);//a0x38000f8return 0; } 3.再结合位取反获取特定位为0的二进制数 1现在我们要获取bit4-bit10为0其余位全部为1的数。怎么做 2利用上面讲的方法就可以(0xf0) | (0x1fffff11) unsigned int a;a ((0xf 0) | (0x1fffff 11));printf(a0x%x\n, a);//a0xfffff80freturn 0; 3但是这些存在问题连续为1的位数太多了这个数字本身就很难构造所以这种方法的优势损失了 4思路是先试图构造出这个数的位相反数再取反得到这个数。比如本例中要构造的数bit4-bit10为0其他位为1那我们先构造出一个bit4-bit10为1其他位为0的数然后对这个数按位取反即可。 //使用位移取反unsigned int a;a ~(0x7f4);printf(a0x%x\n, a);//a0xfffff80freturn 0; 4.总结 1如果你要的这个数比较少位为1大部分位为0则可以通过连续很多个1左移n位得到 2如果你想要的这个数是比较少位为0大部分为1则可以通过先根据其位反数然后再位取反来得到 3如果你想要得到的数中连续1连续0的部分不止1个那么可以通过多段分别构建然后再彼此位与【|】即可。这个时候因为参与位或运算的各个数为1的位是不重复的所以这时候的位或其实相当于几个数的叠加。 四、位运算实战 要置1用|用清零用要取反用^~和《《 》》用来构建特定二进制数。 1.例题1 给定一个整形数a设置a的bit3保证其他位不变。 aa|(13) 或者 a|(13) 2.例题2 给定一个整形数a设置a的bit3-bit7保证其他位不变。 aa|(0x1f3) 或者 a|0x1f 3.例题3 给定一个整形数a清除a的bit15保证其他位不变。 aa ~(0x115) 或者 a~(0x115) 4.例题4 给定一个整形数a清除a的bit15-bit23保证其他位不变。 aa(~(0x1ff15)) 或者 a(~(0x1ff15)) 5.例题5 给定一个整形数a取出a的bit3-bit8 思路         第一步先讲这个数bit3-bit8不变其他位全部清零---aa(0x3f3)        第二步再讲其右移3位得到结果 //第一步把bit3到bit8的位保持不变其余位全部清零 aa (0x3f3) //第二步将其右移3位 a3; 6.例题6 将一个寄存器的bit7-bit17中的值赋值937(其余位不受到影响 关键点不能影响其他位并不知道原来bit7-bit17中装的值 思路         第一步先将bit7-bit18全部清零当然不能影响其他位         第二部将bit7-bit17进行赋值【使用”|“因为我们要赋值】 //第一步bit7-bit17全部清零 a~(0x7ff7); //第二步bit7-bit17赋值937 a|9377; 7.例题7 将一个寄存器的bit7-bit17中的值17(其余位不受到影响 关键点不知道原来的值是多少        思路                 第一步先读出原来的bit7-bit17的值                 第二步给这个值加17                 第三步将bit7-bit17清零                 第四步将第二步算出来的值写入bit7-bit17 unsigned int a0xc30288f8;//第一步先读出原来的bit7-bit17的值unsigned int tmp;tmpa(0x3ff7);//使用【】和全1将这10位数进行计算tmptmp7//将其移动到低位取出//第二步给这个值加17tmp17;//第三步将bit7-bit17清零aa ~(0x3f7);//第四步将第二步算出来的值写入bit7-bit17aa| (tmp7); 8.例题8 将一个寄存器的bit7-bit17中的值赋值937(其余位不受到影响同时个bit21-bit25赋值17 方法1 unsigned int a; unsigned int tmp; //第一步先将bit7-bit17位全部置为0 aa~(0x7ff7); //第二步将这几位进行赋值 aa|(9377); //第三步先取出bit21-bit25 tmpa(0x1f21); tmptmp21; //第四步将17加上 tmp17; //第五步将bit21-bit25置为0 aa~(0x1f21); //第六步将tmp放回到bit21-bit25 aa|(tmp21); 方法2 unsigned int a0x30288f8; a~((0x3ff7) | (0x1f21));//bit7-bit17和bit21-bit25全部清零 a|((9377) | (1721));//937和17全部赋值 五、用宏定义完成位运算 1.直接用宏来置位【赋1】复位【赋0】最右边为第1位 1.1 用宏定义将32位数的第n位(右边其算也就是bit0是第二位置位【变成1】 //第一题用宏定义将32位数的第n位(右边其算也就是bit0是第二位置位【变成1】 //1U:表示无符号1---》(x | (1U (n-1))) #define SET_BIT_N(x,n) (x | (1(n-1)))//因为我们是从bit0开始算的 int main() {unsigned int a 0;unsigned int b 0;bSET_BIT_N(a, 4);//对应bit3printf(0x%x, b);} 1.2 第二题用宏定义将32位数x的第n位(右边其算也就是bit0是第1位清零【变成0】 #includestdio.h//第二题用宏定义将32位数x的第n位(右边其算也就是bit0是第1位清零【变成0】 #define CLEAR_BIT_N(x,n) (x~(1U(n-1))) int main() {//第二题unsigned int a 0xffff;unsigned int b 0;b CLEAR_BIT_N(a, 4);//对应bit3printf(0x%x, b);//0xfff7} 1.3 用宏定义将32位数x的第n位到第m位(右边起算也就是bit0是第1位置位【变成1】 我们需要一个算式得出(m-n1)个1算法第一步先得到32位1----》~(0U)         第二步将第一步得到的数右移x位即可得到(m-n1)个1-----》~(0U)(32-(m-n1))         第三步将得出的结果移回去原来的位置 //第三题用宏定义将32位数x的第n位到第m位(右边起算也就是bit0是第1位置位【变成1】 //我们需要一个算式得出(m-n1)个1 //算法第一步先得到32位1----》~(0U) // 第二步将第一步得到的数右移x位即可得到(m-n1)个1-----》~(0U)(32-(m-n1)) // 第三步将得出的结果移回去原来的位置 #define CLEAR_BIT_N_M (x,n,m) (x| (((~0U)(32-(m-n1)))(n-1)//第三题unsigned int a 0x0;unsigned int b 0;b CLEAR_BIT_N_M(a,5,8);//对应bit3printf(0x%x, b);// 2.截取遍历的部分连续位 #define GETBITS(x,n,m) ((x~(~0U) (m-n1)) (n-1)) (n-1))
http://www.w-s-a.com/news/523860/

相关文章:

  • 平面设计和建设网站的区别公司官网静态
  • h5网站建设+案例住房住房和城乡建设部网站
  • 建设股公司网站东莞建设网网上平台
  • 湖州吴兴建设局网站加强网站建设的
  • 茌平做网站公司专业商城网站建设报价
  • 网站结构图怎么画wordpress注册不发送件
  • 个人备案网站可以做论坛吗电商推广方式有哪些
  • 网站建设 自适应国内最近的新闻
  • 校园网站开发背景吴江网站建设公司
  • 网站开发工程师发展趋势山东省建设工程电子信息网站
  • 适合大学生创业的网站建设类型吉林省舒兰市建设银行网站
  • 呼和浩特网站建设哪家好培训学校加盟费用
  • 网站如何做友情链接有道云笔记WordPress
  • 贵阳企业网站建设制作赤峰浩诚网站建设公司
  • asp官方网站微信模板素材
  • wordpress 留言给站长发邮件做百度推广员赚钱吗
  • 北京建站公司做网站价格专门找人做软件的网站
  • 商务网站的特点ui软件界面设计
  • 广州个性化网站开发网站索引量是什么意思
  • 公司网站制作专业公司python做后台网站的多吗
  • 桂林建站平台哪家好给别人做网站怎么收取费用
  • python做网站显示表格用visual做的网站
  • 彩票网站建设需要什么聊城网站建设首选天成网络
  • 安徽建设工程网站wordpress标签云代码
  • 推荐佛山顺德网站建设手机网站建设域名空间
  • 电子商务网站建设策划书例子企业官网用什么cms系统
  • 网站栏目设计怎么写平面设计接单报价表
  • 做网站美工要学什么网站推广的方法包括
  • 哪个网站可以做笔译兼职wordpress加表单
  • 百度站内搜索 wordpress微餐饮建站费用