位操作符以及在操作暫存器中時的作用

2021-09-26 09:17:02 字數 2351 閱讀 2537

(1)注意:位與符號是乙個&,兩個&&是邏輯與。

(2)真值表:1&0=0 1&1=1 0&0=0 0&1=0

(任何數,其實就是1或者0)與1位與無變化,與0位與變成0

(1)注意:位或符號是乙個|,兩個||是邏輯或。

(2)真值表:1|0=1 1|1=1 0|0=0 0|1=1

(任何數,其實就是1或者0)與1位或變成1,與0位或無變化

(1)注意:c語言中位取反是~,c語言中的邏輯取反是!

(2)按位取反是將運算元的二進位制位逐個按位取反(1變成0,0變成1);而邏輯取反是真(在c語言中只要不是0的任何數都是真)變成假(在c語言中只有0表示假)、假變成真。

實驗:任何非0的數被按邏輯取反再取反就會得到1;

任何非0的數倍按位取反再取反就會得到他自己;

(1)位異或真值表:1^1=0 0^0=0 1^0=1 0^1=1

(任何數,其實就是1或者0)與1位異或會取反,與0位異或無變化

note:

注意~和^的區別。前者是給所有位取反的。後者可以完成給特定位取反。 

對於無符號數,左移時右側補0(相當於邏輯移位)

對於無符號數,右移時左側補0(相當於邏輯移位)

對於有符號數,左移時右側補0(叫算術移位,相當於邏輯移位)

對於有符號數,右移時左側補符號位(如果正數就補0,負數就補1,叫算術移位)

前提條件:比如說32位的暫存器,最低位為bit0,最高位為bit31

例項1:給定乙個整型數a,清除a的bit15,保證其他位不變。

a = a & (~(1<<15));		或者 a &= (~(1<<15));
例項2、給定乙個整形數a,清除a的bit15~bit23,保持其他位不變。

a = a & (~(0x1ff<<15));		或者 a &= (~(0x1ff<<15));
例項3、給定乙個整形數a,清除a的bit15~bit23,bit3~bit5保持其他位不變。

a = a & (~(0x1ff<<15) | ~(0x07<<3));		或者 a &= (~(0x1ff<<15) | ~(0x07<<3));
位取反的優先順序高於左移的優先順序

例項1:給定乙個整型數a,設定a的bit3,保證其他位不變。

a = a | (1<<3)		或者 a |= (1<<3)
例項2、給定乙個整形數a,設定a的bit3~bit7,保持其他位不變。

a = a | (0b11111<<3)	或者 a |= (0x1f<<3);
例項3、給定乙個整形數a,設定a的bit3~bit5,bit15~bit23,保持其他位不變。

a = a | ((0x1ff<<15) | (0x07<<3));		或者 a |= ((0x1ff<<15) | (0x07<<3));
例項1、給定乙個整形數a,對a的bit3~bit7取反,保持其他位不變。

a = a ^ (0b11111<<3)	或者 a ^= (0x1f<<3);
a &= (0x3f<<3);//先將這個數bit3~bit8不變,其餘位全部清零。

a >>= 3;//再將其右移3位得到結果

note:假設最右邊(bit0)為第1位

#define getbits(x, n, m) ((x & ~(~(0u)<<(m-n+1))<<(n-1)) >> (n-1))
這個巨集分為2部分:

(x & ~(~(0u)<<(m-n+1))<<(n-1))     >>     (n-1)

左邊部分實現的功能其實是:bit(n-1)到bit(m-1)不變,其他的清零

右邊部分實現的功能其實是:右移n位得到結果

a &= ~(0x7ff<<7);//先將bit7~bit17全部清零,當然不能影響其他位。

a |= (937<<7);//再將937寫入bit7~bit17即可,當然不能影響其他位。

#define set_nth_bit(x, n)  (x | ((1u)<<(n-1)))

#define clear_nth_bit(x, n) (x & ~((1u)<<(n-1)))

note:

u字尾的代表無符號數,這個在左移的時候其實沒作用,這麼寫是為了規範,因為右移有符號時左側補符號位(如果正數就補0,負數就補1,叫算術移位),右移無符號數時左側補0(相當於邏輯移位)

位操作(暫存器)

stm32中cpu是32位的。最方便快捷的方法是直接操作32位的位址,對某個位址直接賦值是最快的操作,只需要乙個指令。附錄1 在32位的系統中 1字 word 4位元組 byte 1位元組 byte 8位 bit 1b 8bit 1kb 1024b 2 10b 1mb 1024kb 1gb 1024...

指標 暫存器 位操作

define periph base unsigned int 0x40000000 define apb2periph base periph base 0x00010000 define gpiob base apb2periph base 0x0c00 unsigned int 的作用是強制轉...

Java移位操作符以及按位操作符

按位操作符 針對兩個整數引數中的對應位執行布林代數運算,並生成乙個結果。按位與 如果兩個輸入位都是1則生成乙個輸出位1,否則生成乙個輸出位0。按位或 如果兩個輸入位只要有一位是1則生成乙個輸出位1.否則生成乙個輸出位為0。按位異或 如果兩個輸入位只有其中一位是1那麼生成輸出位1,否則生成乙個輸出位為...