[C语言]你真的了解C语言吗之位运算操作

自C语言盛行以来,豪杰并起,执掌一方者不可胜数,Java比于C++,则年轻而效低,然Java遂能克C++,
以弱为强者,非惟效率,抑亦人和也。今Java已拥亿万之众,移动端后端并行,此诚不可与争锋。
Python揭竿而起,随者之众不可胜数,各方类库亦犹过江之鳞,应天时,人和也。
JavaScript据浏览器,已历n世,国险而源富,此二者可以为援而不可图也。自node出世,Js风生水起,
前后端并行,犹有冲击Java之势。然库多而欠理,npm,webpack一举成名。后React,Vue,Angular等应运而生,
大前端之势浩大,恐怖如斯。然鱼龙混杂,犹互旋之水,难复清明。

至于移动,Android、IOS双足对立。Android本忠Java,然跨平台之势如历史洪流,不可阻也,
外有Hybrid,Weex,ReactNative,Flutter纷涌不绝,内有Kotlin暗刀一击,
Android-Java帝国犹有崩摧之势,然习百技,纳百艺,Coder之能也,此乱世之道,更需多技傍身。

C语言面相过程,年虽老矣,尚有余力,底层之功,莫能与之争,实不可因其老而蔑之。
面相过程之于编程,创现世之基业,劳苦之功,无人能出奇右,实无人可蔑之。
函数式之于编程,新生之思,思之至纯,虽年幼却难掩其芒。实不可因其异而蔑之。
此三者,切不可盲从而身陷,亦不可斥而尊宗,习其思,用于正道,方为上上。

来自《隆中对》----张风捷特烈

依稀还记得大一学C语言的时光,讲真的,那是我对编程的初次认识(本人非计科专业),哪成想几年过去了,现在几乎终日与它为伴~要知道在嵌入式开发当中几乎是离不开C语言的,因为C语言是最接近硬件的一门语言,相比于汇编是更加适合人类开发和阅读的一门语言,虽然现在嵌入式开发也有了别的语言,比如Lua,MicroPython,JS等等,但是相对于C语言的执行效率是远远落后的,所以做嵌入式开发学好C语言是很有必要的。虽然自己每天都有写C代码,可是对于C语言的理解还是远远不够的,就比如有些概念还停留在知道、晓得、懂一点的水平,这是制约自己发展的一大重要因素啊!

是时候重新拾起来,仔细去学习一番了,之前单学C语言的时候,总觉得少一点东西,为什么这么说呢?可能只是为了学而学,并不知道在实际应用中该怎么用,有或者在哪些实际情况中会用到,所以就是缺点东西!现在不一样了,有了一个实际的载体(硬件),知道这一块功能如果去实现该怎么写,如果优化该怎么优化,所以现在对C语言有了很多新的理解。

这两天就对这个C语言中的位运算重新学习了一边,可见当时确实学的浅薄,简单一写,加深下理解~

不知道你在开发单片机的过程中有没有遇到过下面的运算符,又或者你能准确的说出每一个运算符的用法吗?

  • &
  • |
  • ^
  • ~
  • <<

我们先来理解下什么是位吧,可能你还记得当时书本中说过的字节和位的区别:

  • 位 计算机中最小的存储单位
  • 字节 计算机中最小的数据单位

那我们该怎么理解呢?我们首先要知道计算机中的数据都是0和1的顺序组合,所有的数据最后都是0和1的特定排列,每8个0和1的排列就组成了最小的数据单位->字节,也就是每个字节都是由8位0和1组成的,就比如说数字“0”,在存储器当中是以“00110000”这样的8位连续的0和1排列的,这是我们通过数据在内存中怎么去保存的去理解位和字节的区别。

那在实际开发当中,位运算有什么用呢?我们实际开发中会用到位操作吗?答案当然是肯定的,最常见的例子就是在某些与寄存器打交道的地方,我们需要频繁的进行微操作,因为寄存中的每一位置“1”或者置“0”都是有不同含义的,就拿比较常见的STM32单片机来说吧,我们看一下它寄存器说明:

image

这是APB1外设复位寄存器的说明。可以看见一共有0~31->32位,STM32的寄存器都是32位的,这个表对此寄存器的每一位是复位哪一个外设的,都做了详细注释,就比如说我们复位DAC(数模转换)吧,我们只需让此寄存器的第29位置“1”就可以让DAC外设复位了。

不闲扯了,来复习我们的C语言吧还是,刚刚给出的6种C语言中的位运算符都知道什么意思了吗?如果还没有,我们来复习一下,下面给出的实际位操作实列都是二进制位模式:

  • & 按位与

00000110 & 00001011 = 00000010

  • | 按位或

00000110 | 00001011 = 00001111

  • ^ 按位异或

00000110 ^ 00001011 = 00001101

  • ~ 按位取反

~ 00000110 = 11111001

  • 向右移位

00000001(结果) = 00000110 >> 2(移动2位)

  • << 向左移位

00011000(结果) = 00000110 << 2(移动2位)

在移位运算中,有两点需要注意:

  1. 向左移位的时候,右边多出来的位用0补齐,超出左边边界抛弃。
  2. 向右移位的时候,左边多出来的位需要根据有无符号或者是否是负数去处理,无符号或者有符号但非负数,左边多出来的位用0补齐,如果是负数,具体填充位的内容是根据编译器决定的。

思考:

  1. int a = 7,将a的第7位置“1”,不改变其它位。

① a |= (0x01 << 7)

② a |= 0x80

2. int a = 7,将a的第1位置“0”,不改变其它位。

① a &= ~ (0x01 << 1)

② a &= ~ 0x02

③ a ^= 0x20

3. int a = 7,将a的第7位置“1”后再清除,不改变其它位。

置“1”:

① x = a | (0x01 << 7)

② x = a | 0x80

清除:

① a = x & (~(0x01 << 7))

② a = x & (~0x80)

③ a = x ^ 0x80

4. int a = 7,将a的第1位置“0”后再置“1”,不改变其它位。

置“0”:

① x = a & (~ (0x01 << 1))

② x = a & (~ 0x20)

③ x = a ^ 0x20

置“1”:

① x = a | (0x01 << 1)

② x = a | 0x20

简单写两个实列,帮助记忆,在嵌入式开发当中置位和清除是比较常见的操作,只有熟练操作才可以运用的更加熟练,一般为了对位操作的方便性和方便移植,都会写成下面的宏定义:

#define setbit(x,y) x |= (0x01 << y)
#define clrbit(x,y) x &= ~(0x01 << y)
#define reversebit(x,y) x ^= (0x01 << y)
#define getbit(x,y)  ((x) >> (y) & 0x01)

先写到这里,如果有表述错误,还请指出我好修正。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容