位运算小结

发布者:a407895356最新更新时间:2015-08-07 来源: dzsc关键字:位运算  位运算符 手机看文章 扫描二维码
随时随地手机看文章
位运算符:
& bitwise AND
| bitwise inclusive OR
^ bitwise exclusive OR
<< left shift
>> right shift
~ one's complement (unary)
 
在书中遇到一个写法:~(~0 << 3),按照自己的理解,~符号代表位取反,我就想岂不是等于~(1 << 3)
不幸的是,前者等于0x7,后者等于0xfffffff7。
 
括号内是最低位二进制表示。
~0 == 0xffffffff(1111) ~0 << 1 == 0xfffffffe (1110)
~0 << 2 == 0xfffffffc(1100) ~0 << 3 == 0xfffffff8(1000)
~(~0 << 3) == 0x7(0111)
 
 
1 << 3 == 0x8(1000) ~(1 << 3) == 0xfffffff7(0111)
理解错误主要在这里,0x8有效位后的高位并没有打印出0,但是取反的时候,这些0全部有效。
 
 
书中第一题:
Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position
p set to the rightmost n bits of y, leaving the other bits unchanged.
 
思路:
1.把x中从p位开始(包括p位)的n位清0。
2.把y中最右n位取出。
3.把y中取出的n位移至p位作为最低位。
4.把1和3的结果做“位或运算”。
 
过程:
此处用setbits (15, 3, 2, 8)作为例子(x = 1111, p = 3, n = 2, y = 1001)。
 
1. ~0 << (p+n-1) 得到 0xfffffff0,即低四位为0000。
2. ~(~0 << (p-1)) 得到 0x3,即低四位为0011。
3. 把1和2的结果做“|”运算(得0xfffffff3)。就可以通过“&”运算把任意数“从p位开始的n位清0”,而其他位不改变。
4. 把x和上述结果做“&”运算(0xfffffff3 & 0xf),得到0x3,即原低四位1111从第3位起,3、4位被清0(更高位也被清0,但3、4位是我们想要的结果)。x部分运算完毕。
5. ~(~0 << n)得到0x3(0011)。
6. 把y和5结果做“&”运算(0011 & 0001),y的最右n位取出,其他位清0(得0001)。
7. 把6的结果0001 << (p-1),左移到指定位置得0x4(0100)。y部分运算完毕。
8. 结果x部分和y部分做“|”运算(0100| 11),得到最终结果0111。符合题目要求
 
 
书中第二题:
Write a function invert(x,p,n) that returns x with the n bits that begin at position p
inverted (i.e., 1 changed into 0 and vice versa), leaving the others unchanged.
 
思路:
1.进行~x运算,所有位取反。
2.把步骤1的结果通过>>(p-1)配合第4步给低位清0。
3.第2步的结果和 ~(~0 << n)进行“&”运算,把不需要的高位也清0。
4.把步骤3结果<<(p-1),得到符合位置要求的取反位,同时保证其他位清0。
5.同上一题,把x相应位清0,然后“|“第4步得到的对应位,就可以得出结果。
 
 
总结:
1.位运算在硬件操作中经常使用,ARM中更是常见这种多位数的位运算。
2.要记住两个常用位运算的功能 :
~0<设n == 4 0xfffffff0
~(~0<设n == 4 0xf
3.在做位运算,尤其是位移时,不要把十六进制和二进制搞混,二进制移4位才相当于十六进制移1位。
关键字:位运算  位运算符 引用地址:位运算小结

上一篇:常见数据类型大小范围
下一篇:用tab替换行输入中的4个连续blank

推荐阅读最新更新时间:2024-03-16 14:27

C51—运算量(重点:特殊功能寄存器变量、变量
C51就是c语言for 51单片机,这里边还是有很多不同的,在c语言里运算量相信都知道那叫一个简单,直接int, float就哦了 ,当然这里也可以直接int, float,但是他们还是有不同的,这里就介绍一下运算量中的不同! ,相同的我就直接跳过~(果断不说了,不同的对于以后c语言开发51单片机还是相当有用的,慢慢的就会体会到了~~~~~ ,尤其是特殊功能寄存器变量、位变量、还有绝对地址的访问! C51的运算量(只说重点~): C51中的运算量主要是常量和变量。 1、常量 常量是指在程序执行过程中不能改变的量。在C51中支持整型常量、浮点型常量、字符型常量和字符串型常量。 1)整型常量 2)浮点型常量 3)字符型常量
[单片机]
C51—<font color='red'>运算</font>量(重点:特殊功能寄存器变量、<font color='red'>位</font>变量
STM8学习笔记---寄存器操作之或和运算
刚开始学习STM8单片机时,看别人的代码,在设置寄存器的时候经常使用,位或、位与、左移、右移等运算,就很不理解,为什么不直接给寄存器赋值,非要搞的这么复杂。直到后来程序写的多了,才明白这样写的好处。比如我们现在要设置PB5口为输出口。首先我们需要设置PB口的方向寄存器PB_DDR。 我们要设置PB5口为输出,那么就要把DDR5位设置为1。那么要设置的寄存器PB_DDR寄存器二进制数据为 0010 0000,转换为16进制为 0x20。设置寄存器的语句为 PB_DDR = 0x20; 这样操作寄存器看起来没什么问题,也挺方便。唯一的问题就是每次要先将设置的二进制数确定好,然后再转换为16进制数,再赋值给寄存器。代码少的时
[单片机]
STM8学习笔记---寄存器操作之<font color='red'>位</font>或和<font color='red'>位</font>与<font color='red'>运算</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved