历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2021年03月23日 | 单片机位操作的逻辑运算详解

2021-03-23 来源:eefocus

首先,对一个字节,8位也好,16位也好,32位也好,只有两种操作,一种叫置位,一种叫清零。先从置位说起。

置位可以对全部位进行操作,也可以对某个位进行操作。


全部操作很简单直接赋值就ok了。我们假设一个无符号字符型uchar为8位。且最低位为0,也就是说0-7位,而不是1-8位,那么改变值的状态只需要直接等于就ok了


uchar a=0;

a=0xfe;


这样的话,就让a的低1-7位置1,a的0位不变

但这样做有一个问题,我每次改变数值时,还要先打开计算器,然后设置到2进制功能,然后要把我要选择的位输入进去,比如100,然后按16进制功能。然后计算器显示4。我觉得这样很麻烦。咋办呢,结果前辈们就想出了一个法子。通过位移的方法改变一个为,就变成了这样


uchar a=0;

a = (1<<5);


这样做的话,就把a的第6位(注意是第6为不是第5位,因为数据最低位是0,而不是1,因为我总是搞混,所以也告诫大家,小心着方面的错误,如果搞混,你的数据有可能出错)置1。那么a的值用2进制表示的话那就是00100000b,那么可能又会有人问,如果我想把第2和第3位置1怎么办呢?那么你可以这样


uchar a=0;

a = (3<<1);


这样做的意思是将二进制(11)位移到第二位的地方。那么第二位,是第一个1,第三位是第二个1。同理假如让第3位和低5位为1,第4位为0,怎么办。


uchar a=0;

a = (5<<2);


这样就可以实现101位移到第3位了,以上,基本是置位的大概操作了,当然这只是一次性的。也就是说,如果我希望1次只操作一个位,比如当a=00000001b时,我希望a的第二位也置1,且第一位仍然保持1,怎么办呢?那也有办法,可以采用与操作。例如:a为1,我希望a的第2位置1,且第1位保持不变,那么


uchar a=1;

a |= (1<<1);


这样就可以达到想要的结果了。然我们来看看,这是为什么?

首先,a=1,变成二进制时,a=00000001b

然后再看下面的那个表达式

a |= (1<<1);

分析一下,看过c语言相关书籍的人大概都知道这个一个含有复合的赋值运算符的表达式。这个式子可以拆成:

a=a|(1<<1);

这样就不难理解了,(1<<1)的意思是把1左移1位,那么结果就是10b,把这个结果在和a进行或操作,我们知道或操作是同为0结果才是0。


a 00000001

或操作 00000010

结果 00000011


所以这个公式就可以使在不改变a=1的情况下,再使a的第2位变成1,这样的结果就是a=3。这就是这个公式的大概原理。

不仅这个,我还可以分别对两个不同的位进行操作。所以我可以这样:


uchar a=1;

a |= (1<<2)|(1<<3)|(1<<4)|(1<<5);


这样的话,就可以把第3、4、5、6位全部置1,而且保持a的第1位不变,这个公式的最终结果是00111101b。 同样,这招,在全部置位也有效。但是a原来的值就消失了


uchar a=1;

a = (1<<2)|(1<<3)|(1<<4)|(1<<5);


那么结果只有4个1,00111100b,第1位的一就没有了

同样比如(3<<1)也可以出现在单一置位当中


uchar a=1

a |= (3<<1);


这个表达式结果为00000111b。到这,置位操作,基本上就都在这了,大多数程序,这几个方法也够了,这也是晚上普遍的方法,也许还有其他的方法,如果你知道,希望能够通知我。下面说说清0,清0可以用(&=~),举个例子:


uchar a=0xfe;

a &=~ (1<<4);


让我们来分析一下这个式子,首先这和上面一样,是一个含有复合的赋值运算符的表达式。拆开来以后


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


这个式子比刚才要复杂一些,让我们先来看看括号最里面的(1<<4)

结果为10000b,然后我们把这个式子取反,因为a是8位的,所以结果被转换成11101111b,然后我们在把a和这个结果进行与运算。因为与运算的规律是全1为1。


a 11111110b

与操作 11101111b

结果 11101110b


现在,我们清楚了这个结果时怎么来的了。

同样同时使两位变为0也可以通过(3<<5)来实现,比如


uchar a=0xfe;

a &=~ (3<<4);


这样也是可以得到希望的结果的,但是需要注意一下,(1<<2)|(1<<3)|(1<<4)|(1<<5),像这种一位一位的变则需要注意一下了。因为清零中先需要取反,所以如果希望一位一位的变,则需要用括号,把结果扩起来,形成一个值,然后再取反,才能得到想要的结果了。比如


uchar a=0xfe;


/*

注意,这样做是不对的,结果只会把第二位清0,

a &=~ (1<<2)|(1<<3)|(1<<4)|(1<<5);

*/

a &=~ ((1<<2)|(1<<3)|(1<<4)|(1<<5));


这样做才能达到希望的效果。

可能大家会想,用(&=)会得到啥样的结果呢?这我试了一下


uchar a=0xfe

a &= (1<<4);


首先(1<<4),结果是10000,然后再进行与操作


a 11111110b

与操作 00010000b

结果 00010000b


这个结果不是我们想要的,不过这个结果可以达到屏蔽我们不要的位,比如在判断中,判断最高位是否为1,可以采用这样的语句


if(a&0x80)


这句话,如果a的最高位为1,则为真,如果最高位不为1,则为假,如果位最高位为1的话,结果为10000000,在c语言中不为0,则为真,所以判定某位是否为1时,可以采用&操作。


以上就是简单的总结了一下置位,清零的逻辑操作的方法。


推荐阅读

史海拾趣

Facon公司的发展小趣事

在发展过程中,Facon遇到了许多技术难题。然而,他们从未放弃过对技术的追求和突破。经过数年的研究和实践,Facon成功研发出了一款具有划时代意义的低功耗芯片,该芯片在保持高性能的同时,大大降低了能耗,为电子产品的续航能力带来了革命性的提升。这一技术突破让Facon在行业中声名鹊起,吸引了众多合作伙伴的关注。

富信半导体(FOSAN)公司的发展小趣事

在2010年代初,随着科技的飞速发展,电子行业正迎来新一轮的创新浪潮。这时,一群充满激情和梦想的工程师在硅谷创立了Facon公司,他们怀揣着改变世界的愿景,立志在电子行业中留下自己的印记。初始阶段,Facon主要专注于研发高性能的半导体芯片,为智能手机、平板电脑等电子产品提供强大的计算能力。通过不懈努力和持续创新,Facon逐渐在市场中树立了良好的口碑。

Beckhoff Automation GmbH公司的发展小趣事

在电子行业的快速发展中,BCD Semi公司凭借其卓越的技术创新能力,成功研发出了一系列具有竞争力的半导体产品。公司拥有一支经验丰富的研发团队,不断探索新技术和新应用,将最新的科技成果转化为具有市场竞争力的产品。通过技术创新,BCD Semi在行业中逐渐树立起了良好的口碑,赢得了众多客户的信任和支持。

Crane Co.公司的发展小趣事

到了1860年代,Crane Co.作为西北制造公司,开始为铁路部门供应蒸汽机的关键部件,并涉足蒸汽加热业务领域。这一时期,公司不仅展现了其在机械制造方面的实力,还通过不断创新和拓展业务范围,为公司的长远发展奠定了坚实基础。

Aavid Thermalloy公司的发展小趣事

在1870年代,Crane Co.在制造业改善方面争当先驱。公司引入了由R. T. Crane发明的多用途机器,以及移动模具和浇铸金属的传送系统。这些创新技术不仅提高了生产效率,还标志着铸造领域流水线生产的开端。这一时期的变革为Crane Co.在电子行业的发展奠定了技术基础。

ERGOBAHCO公司的发展小趣事

进入21世纪后,电子行业面临着技术更新换代的巨大变革。ERGOBAHCO公司敏锐地捕捉到了这一变革带来的机遇和挑战,开始加大在新技术、新产品的研发力度。公司通过与高校、科研机构等合作,成功推出了一系列符合市场需求的智能化、绿色化的电子产品。这些产品不仅为公司带来了丰厚的利润回报,也进一步巩固了公司在行业内的领先地位。

问答坊 | AI 解惑

USB驱动分析 绝对经典的一本书

usb源码详析,linux-usb-hub,linux-usb-core, 嬉笑怒骂、娓娓道来。可惜原作者没有署名,在此向原作者致以崇高的敬意!…

查看全部问答>

HD44780

HD44780HD44780HD44780…

查看全部问答>

液位传感器

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 液位传感器.doc  …

查看全部问答>

嵌入式Linux开发公益体验活动介绍(5月16号本周六)

嵌入式Linux开发公益体验活动介绍(5月16号本周六)                 (目前已经只剩6个名额,预报从速!!) 体验活动目标: 本活动针对嵌入式Linux开发的初学人员,能快速了解嵌入式Linux ...…

查看全部问答>

求本书 the indispensable pc hardware book 哪有啊 找了半天了谢谢各位大大了

求本书 the indispensable pc hardware book 哪有啊 找了半天了谢谢各位大大了…

查看全部问答>

如果成形滤波采用平方根升余弦的话,接受端的匹配滤波器 怎么实现?

如题,用什么函数可以实现呢  各位大侠  (matlab)…

查看全部问答>

谁用USB单片机开发过加密狗

有成熟技术者,可与我联系,本人还可以资助一点开发费,嘻!mail@net9999.com …

查看全部问答>

求keil uv4 下的LPC2294的工程模板

新手, 现在LPC2294的arm7单片机,求个模板。…

查看全部问答>

TI的图形库

这里借鉴了“https://home.eeworld.com.cn/space.php?uid=139305&op=photo”同学的帖子,也简单的实现了TI的图形库功能,拿来炫炫。因为我选用的屏是320*480的,所以画面显得更好看些~     现在还没有做控件方面的东西,有兴趣的 ...…

查看全部问答>

【MSP430共享】大家一起DIY一块MSP430开发板

最近手里有点430的片子,大家一起想想看做个什么开发板,只限F149和F5438,我只有这两种片子,建议用5438搞,原则是功能外设一定要多,价格成本一定要低,大家多提意见,我选择贡献最大的5名坛友到时每人送一块开发板pcb+430CPU一枚,具体大家可以 ...…

查看全部问答>