摘要:總結(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)源
運(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)。
按位與的定義是:同一二進(jìn)制位上的數(shù)字都是1的話,& 的結(jié)果為1,否則為0。
運(yùn)算 | 結(jié)果 |
---|---|
0 & 0 | 0 |
0 & 1 | 0 |
1 & 0 | 0 |
1 & 1 | 1 |
根據(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
是不變。
定義:只要參與運(yùn)算的雙方其中有一個(gè)是1,結(jié)果就是1.同0才為0。
運(yùn)算 | 結(jié)果 |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
主要用作將某些特定位置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。
只要參與運(yùn)算的雙方互異,結(jié)果就為1,否則為0。
運(yùn)算 | 結(jié)果 |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
可以通過(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)。
對(duì)一個(gè)二進(jìn)制數(shù)進(jìn)行取反。1變0,0變1。
唯一需要注意的一點(diǎn)是,~的優(yōu)先級(jí)是邏輯運(yùn)算符中最高的,必須優(yōu)先計(jì)算。
左移與右移比較類似,是將目標(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 |
右移看情況:負(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é):左乘右除。
比如要改變 GPIOA 的狀態(tài),可以先對(duì)寄存器的值進(jìn)行 &
清零操作
GPIOA -> CRL &= 0XFFFFFF0F; // 將第 4-7 位清 0
然后再與需要設(shè)置的值進(jìn)行 |
或運(yùn)算
GPIOA -> CRL |= 0X00000040; // 設(shè)置相應(yīng)位的值,且不改變其他位的值
以固件庫(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。
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
摘要:有符號(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ǔ),所以位操作符的作用也就是...
摘要:原碼補(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....
摘要:將任一數(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...
摘要:操作符的兩個(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)身高重量屬性類型 ...
摘要:語(yǔ)言基礎(chǔ)之操作符詳解操作符的分類算術(shù)操作符移位操作符位操作符邏輯操作符逗號(hào)表達(dá)式表達(dá)式求值隱式類型轉(zhuǎn)換算術(shù)轉(zhuǎn)換操作符的屬性今天就帶各位大佬來(lái)了解一波語(yǔ)言的操作符。 ...
閱讀 1387·2021-11-25 09:43
閱讀 3608·2021-11-10 11:48
閱讀 5189·2021-09-23 11:21
閱讀 1612·2019-08-30 15:55
閱讀 3523·2019-08-30 13:53
閱讀 1250·2019-08-30 10:51
閱讀 883·2019-08-29 14:20
閱讀 1988·2019-08-29 13:11