成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【STM32】位操作、按位與、按位或、按位異或、取反、左移、右移等基礎(chǔ) C 語(yǔ)言知識(shí)補(bǔ)充

waruqi / 5188人閱讀

摘要:總結(jié)對(duì)于原二進(jìn)制數(shù)來(lái)說(shuō),是不變,是反轉(zhuǎn)。的位數(shù)對(duì)應(yīng)原二進(jìn)制數(shù)的位數(shù),對(duì)各位進(jìn)行屏蔽,全部置。左移左移與右移比較類似,是將目標(biāo)二進(jìn)制數(shù)字向左右移動(dòng)相應(yīng)的位數(shù)。語(yǔ)言中的邏輯運(yùn)算符按位與,按位或,按位異或,取反,左右移位不完全手冊(cè)立創(chuàng)開(kāi)源

1 位操作

運(yùn)算符含義
&按位與
按位或
^按位異或
~取反
<<左移
>>右移

c 語(yǔ)言中存在以上 6 個(gè)位操作運(yùn)算符,且它們只能用于整形操作數(shù)。

總結(jié):對(duì)于原二進(jìn)制數(shù)來(lái)說(shuō),&0是屏蔽,&1是不變。

總結(jié):對(duì)于原二進(jìn)制數(shù)來(lái)說(shuō),|0是不變,|1是置1。

總結(jié):對(duì)于原二進(jìn)制數(shù)來(lái)說(shuō),^0是不變,^1是反轉(zhuǎn)。


1.1 按位與

按位與的定義是:同一二進(jìn)制位上的數(shù)字都是1的話,& 的結(jié)果為1,否則為0。

運(yùn)算結(jié)果
0 & 00
0 & 10
1 & 00
1 & 11

根據(jù)這個(gè)特性,& 操作常常用來(lái)屏蔽特定的二進(jìn)制位。

例如:0000 1111 & 0000 0011 = 0000 0011

與運(yùn)算0 0 0 0 1 1 1 1
&0 0 0 0 0 0 1 1
結(jié)果0 0 0 0 0 0 1 1

可以看見(jiàn),1111的前兩位被屏蔽成為0了。

所以如果想清空數(shù)據(jù),只需要將原二進(jìn)制數(shù)與上 &0 就可以了。0的位數(shù)對(duì)應(yīng)原二進(jìn)制數(shù)的位數(shù),對(duì)各位進(jìn)行屏蔽,全部置0。

相對(duì)的,&可以利用0來(lái)屏蔽,也可以用1來(lái)讀取。

例如: 一個(gè)二進(jìn)制數(shù) 1101 1001,我只想要它的后四位,怎么辦呢?

只需要進(jìn)行如下操作:1101 1001 & 0000 1111即可。

與運(yùn)算1 1 0 1 1 0 0 1
&0 0 0 0 1 1 1 1
結(jié)果0 0 0 0 1 0 0 1

其實(shí)該方法是屏蔽和讀取的結(jié)合,&0保證消除無(wú)用位,&1保證有用數(shù)據(jù)的完整性。

總結(jié):對(duì)于原二進(jìn)制數(shù)來(lái)說(shuō),&0是屏蔽,&1是不變。


1.2 按位或

定義:只要參與運(yùn)算的雙方其中有一個(gè)是1,結(jié)果就是1.同0才為0。

運(yùn)算結(jié)果
0 | 00
0 | 11
1 | 01
1 | 11

主要用作將某些特定位置1。

例如:1010 0000 | 0000 1111 = 1010 1111。

或運(yùn)算1 0 1 0 0 0 0 0
0 0 0 0 1 1 1 1
結(jié)果1 0 1 0 1 1 1 1

總結(jié):對(duì)于原二進(jìn)制數(shù)來(lái)說(shuō),|0是不變,|1是置1。


1.3 按位異或

只要參與運(yùn)算的雙方互異,結(jié)果就為1,否則為0。

運(yùn)算結(jié)果
0 ^ 00
0 ^ 11
1 ^ 01
1 ^ 10

可以通過(guò)上面的定義看到,一個(gè)數(shù)^1 的話就會(huì)0變成1,1變成0,而^0則不對(duì)原數(shù)進(jìn)行改變。所以根據(jù)此特性可以對(duì)特定位進(jìn)行0 1 反轉(zhuǎn)。

例如: 1100 1100 ^ 0000 1100 = 1100 0000。

異或運(yùn)算1 1 0 0 1 1 0 0
^0 0 0 0 1 1 0 0
結(jié)果1 1 0 0 0 0 0 0

同樣的,如果對(duì)一個(gè)數(shù)進(jìn)行^0,代表保留原值。

總結(jié):對(duì)于原二進(jìn)制數(shù)來(lái)說(shuō),^0是不變,^1是反轉(zhuǎn)。


1.4 取反

對(duì)一個(gè)二進(jìn)制數(shù)進(jìn)行取反。1變0,0變1。

唯一需要注意的一點(diǎn)是,~的優(yōu)先級(jí)是邏輯運(yùn)算符中最高的,必須優(yōu)先計(jì)算。


1.5 左移

左移與右移比較類似,是將目標(biāo)二進(jìn)制數(shù)字向左/右移動(dòng)相應(yīng)的位數(shù)。

左移補(bǔ)0:1111 1111 << 1 == 1111 1110,換算十進(jìn)制的話是原來(lái)數(shù)值的2倍。

左移1 1 1 1 1 1 1 1
<<1
結(jié)果1 1 1 1 1 1 1 0

1.6 右移

右移看情況:負(fù)數(shù)補(bǔ)1,正數(shù)補(bǔ)0。需要看符號(hào)位。同樣,換算為十進(jìn)制數(shù)值變?yōu)樵瓉?lái)的1/2.

右移1 1 1 1 1 1 1 1
>>1
結(jié)果0 1 1 1 1 1 1 1

總結(jié):左乘右除。


2 單片機(jī)中常用操作

2.1 不改變其他位時(shí),對(duì)某幾個(gè)位設(shè)定值

比如要改變 GPIOA 的狀態(tài),可以先對(duì)寄存器的值進(jìn)行 & 清零操作

GPIOA -> CRL &= 0XFFFFFF0F;		// 將第 4-7 位清 0

然后再與需要設(shè)置的值進(jìn)行 或運(yùn)算

GPIOA -> CRL |= 0X00000040;		// 設(shè)置相應(yīng)位的值,且不改變其他位的值

2.2 移位操作提高代碼可讀性

以固件庫(kù)的 GPIO 初始化的函數(shù)里一行代碼為例

GPIOx -> BSRR = (((uint32_t)0x01) << pinpos);

這個(gè)操作就是將 BSRR 寄存器的第 pinpos 位設(shè)置為 1。
為什么要通過(guò)左移而不是直接設(shè)定呢?其實(shí),這是為了提高代碼的可讀性以及可重用性。這行代碼可以直觀明了的知道,是將第 pinpos 位設(shè)置為 1。

如果寫(xiě)成

GPIOx -> BSRR = 0x0030;

這樣的代碼就不容易看出,也不好重用了。

類似的代碼還有:

GPIOA -> ORT |= 1<<5;		// PA.5 輸出高,不改變其他位

這樣我們一目了然,5 告訴我們是第 5 位也就是第 6 個(gè)端口,1 告訴我們是設(shè)置成了 1。

2.3 取反操作使用技巧

SR 寄存器的每一位都代表一個(gè)狀態(tài),某個(gè)時(shí)刻我們希望去設(shè)置某一位的值為 0,同時(shí)其他位都保留位 1,簡(jiǎn)單的作法是直接給寄存器設(shè)置一個(gè)值:

TIMx -> SR = 0xFFF7;

這樣做法可讀性交較差。

看看庫(kù)函數(shù)中代碼是如何使用的:

TIMx -> SR = (uint16_t)~TIM_FLAG;

而 TIM_FLAG 是通過(guò)宏定義完成的值:

#define TIM_FLAG_Update		((uint16_t)0x0001)#define TIM_FLAG_CC1		((uint16_t)0x0002)

看這個(gè)就容易明白,可以直接從宏定義重看出 TIM_FLAG_Update 就是設(shè)置的第 0 位了,可讀性較強(qiáng)。


Ref: C語(yǔ)言中的邏輯運(yùn)算符:按位與,按位或,按位異或,取反,左右移位
Ref: STM32 不完全手冊(cè) - 立創(chuàng)開(kāi)源

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/120808.html

相關(guān)文章

  • 淺談JavaScript操作

    摘要:有符號(hào)的右移操作符由兩個(gè)大于符號(hào)表示這個(gè)操作符的含義就是將數(shù)值的位向右移指定的位數(shù)同時(shí)保留符號(hào)位的值正負(fù)號(hào)標(biāo)記有符號(hào)的右移操作符與左移操作符剛好相反比如向右移動(dòng)位就是同樣的在移位的過(guò)程中也會(huì)出 位操作符的基本概念 因?yàn)镋CMAscript中所有數(shù)值都是以IEEE-75464格式存儲(chǔ),所以才會(huì)誕生了位操作符的概念. 位操作符作用于最基本的層次上,因?yàn)閿?shù)值按位存儲(chǔ),所以位操作符的作用也就是...

    fasss 評(píng)論0 收藏0
  • 由left-pad扯到JS中的運(yùn)算

    摘要:原碼補(bǔ)碼和反碼原碼一個(gè)數(shù)在計(jì)算機(jī)中是以二進(jìn)制的形式存在的,其中第一位存放符號(hào)正數(shù)為負(fù)數(shù)為。中的位運(yùn)算在中按位操作符會(huì)將其操作數(shù)轉(zhuǎn)成補(bǔ)碼形式的有符號(hào)位整數(shù)。原文鏈接由扯到中的位運(yùn)算 這個(gè)話題的由來(lái)是2016年3月份的時(shí)候 NPM 社區(qū)發(fā)生了‘left-pad’事件,不久后社區(qū)就有人發(fā)布了用來(lái)補(bǔ)救的,也是現(xiàn)在大家能用到的 left-pad 庫(kù)。 最開(kāi)始這個(gè)庫(kù)的代碼是這樣的。 module....

    LeoHsiun 評(píng)論0 收藏0
  • 操作

    摘要:將任一數(shù)值與執(zhí)行按位與操作,其結(jié)果都為。中應(yīng)用判斷奇偶性偶數(shù)奇數(shù)按位異或規(guī)則每一位都不同,結(jié)果才為將任一數(shù)值與進(jìn)行異或操作,其結(jié)果為。 位運(yùn)算在算法中很有用,速度可以比四則運(yùn)算快很多。 To2orTo10 JS中十進(jìn)制轉(zhuǎn)二進(jìn)制: (val).toString(2)JS中二進(jìn)制轉(zhuǎn)十進(jìn)制: parseInt(val, 2) JS中規(guī)定安全整數(shù)的范圍是-2^53~2^53,所以大于90071...

    caiyongji 評(píng)論0 收藏0
  • 請(qǐng)回答c語(yǔ)言-操作符【入門(mén)】

    摘要:操作符的兩個(gè)操作數(shù)必須為整數(shù)。函數(shù)調(diào)用用作為函數(shù)調(diào)用操作符。訪問(wèn)一個(gè)結(jié)構(gòu)的成員結(jié)構(gòu)體成員名結(jié)構(gòu)體指針成員名還是熟悉的栗子在之前的博客請(qǐng)回答語(yǔ)言初識(shí)語(yǔ)言下入門(mén)的結(jié)構(gòu)體出現(xiàn)過(guò)的栗子名字圖鑒編號(hào)身高重量屬性類型 ...

    frolc 評(píng)論0 收藏0
  • C語(yǔ)言基礎(chǔ)操作符詳解

    摘要:語(yǔ)言基礎(chǔ)之操作符詳解操作符的分類算術(shù)操作符移位操作符位操作符邏輯操作符逗號(hào)表達(dá)式表達(dá)式求值隱式類型轉(zhuǎn)換算術(shù)轉(zhuǎn)換操作符的屬性今天就帶各位大佬來(lái)了解一波語(yǔ)言的操作符。 ...

    snowell 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<