C語言中的位運算子相關筆試題

2021-06-25 21:41:35 字數 2043 閱讀 5664

由於位運算具有執行效率高且不容易受到資料位數長短的影響,具有較好的移植性,同時,由於位運算都可以直接翻譯為彙編**,故**的執行效率往往也比較高,故在嵌入式領域具有廣泛的應用。

一、一些面試題

例一、用乙個表示式,判斷乙個數x是否為2的n次方,不用迴圈語句。

結果:!(x&(x-1))

例二、取兩個變數中較大數,不適用if,?,switch或其他判斷語句。

結果:int max = (a+b+abs(a-b))/2

例三、不使用中間變數交換a,b。

結果: 

a = a^b;

b = a^b;

a = a^b; 例

四、取0的反碼。

錯誤寫法:

unsigned int zero = 0;

unsigned int zerocomplement = 0xff;

正確寫法:

unsigned int zero = 0;

unsigned int zerocomplement = ~zero;

說明:需要考慮到在不同字長的機器上的移植性,錯誤寫法預設16位,只能在16位機上執行,二使用位運算寫的**將不受字長限制,具有很好的移植性。

二、嵌入式系統中的典型應用。

應用一:將暫存器中的某一位置1或則清0,保持其他位不變。

int l_data;

void setbit(int pos)//將某一位置位的操作

}void clrbit(int pos)//將某一位清0的操作}

說明:該操作的依據如下:

1.0|1 == 1,1|1 == 1,故無論0還是1同1執行|操作,結果為1;無論0還是1同0執行|操作,都將保持不變。

2.1&0 == 0,0&0 == 0,故無論0還是1同0執行&操作,結果為0;無論0還是1同1執行&操作,都將保持不變。

應用二、判斷暫存器某一位為0還是1

bool is1(int pos)//判斷某一位是否為1

else}}

應用三、將暫存器的某一位取反(1->0;0->1)

void reversebit(int pos)//將某一位取反}

說明:與0異或,保持不變;與1異或,取反。 應用

四、保留2個數的不同部分,將它們合併為1個數

方法一:這兩個數除了有效位之外,其他位均為0,可以將其先適當移位操作,然後在"|"運算。

例一:將temp中的低8位和t中的高4位組合成乙個12位數

unsigned short temp = 0x00ab;

unsigned char t = 0xc0;

temp = temp<<4;

temp |= (t>>4);

例二:保留channel的底4位,將其作為result的高4位,result的低4位設定為0xc;

channel = (channel<<4) | 0x0c;

方法二:如果這2個數除了有效位之外,其他位需要保留為1,方法是先與適當的數"|",之後2個數"&"

例一:保留temp的高4位和line的底4位,並將其組合成result。由於line的其他位全位1,所以必須先將temp的其他位全部設定為1,之後2個數"&"即可。

unsigned char result;

unsigned char temp = 0xab;

unsigned char line = 0xfe;

temp |= 0x0f;

result = temp&line; 應用

五、將乙個16位數的高低8位分別拆成2個8位數,方法是通過多位元組數賦給少位元組數,多位元組數高位位元組部分將被自動擷取的原理。

unsigned short temp = 0xcdab;

unsigned char fir;

unsigned char sec;

fir = temp>>8;

sec = temp; 應用

六、如果cpu沒有來算數移位操作,如何用邏輯移位操作實現。

例如:line = 0xfe,如何實現其的左移操作後,右邊補入的是1而不是預設的0。

line = (line<<1)|0x01;

C語言中的運算子

c語音中的運算子,按其功能,可以分為 算數運算子,關係運算子,邏輯運算子,自增和自減運算子,按位運算子,賦值運算子,和條件運算子。1 算數運算子 運算元可以為任何基本型別,運算結果的型別和運算元型別相同。2 關係運算子 運算元可以為任何基本型別,一般為整型,運算結果,如果兩個運算元關係成立,則結果為...

C語言中的運算子

c語言中的運算子 一 運算子 1 算術運算子 2 賦值運算子 賦值運算子用 來給變數賦值。注意,在c語言中 不表示相等,而只是乙個運算子。3 增量和減量運算子 在程式開發中,我們經常需要對乙個變數的值執行加1或者減1的操作。例如 x x 1 x x 1 為簡化這種操作,c語言提供了增量運算子 和減量...

c語言中的運算子

c語言運算子 是說明特定操作的符號 它是構造c語言表示式的工具 c語言 的運算異常豐富,除了控制語句和輸入輸出以外的幾乎所有的基本操作都為運算子處理。除了常見的三大類,算術 運算子 關係運算子與邏輯運算子之外,還有一些用於完成特殊任務的運算子,比如位運算子。一 算術運算子 1.加法運算子 除了可以進...