《C語言解惑》一1 4 二進位制位操作符

2021-09-23 16:47:58 字數 3210 閱讀 1462

謎題1.4 二進位制位操作符

請問,下面這個程式的輸出是什麼?

輸出:

x | y & z = 3                               (1.4.1)

解惑1.4 二進位制位操作符

初始值:x = 03, y = 02, z = 01

x | y & z   在c語言裡,以零(0)開頭的整數常數是八進位制數值。因為八進位制很容易轉換為二進位制,所以八進位制數值很適合用來進行各種二進位制位操作。在這道謎題裡,01、02、03(八進位制)與1、2、3(十進位制)完全等價,而我們在此明確地使用八進位制數值的目的是,為了提醒讀者注意這道謎題是對變數x、y和z的值進行位操作。

(x | (y & z)) 對操作符和運算元進行繫結。

(x | (02 & 01)) 先對最內層的表示式求值。

(x | 0) 在二進位制裡,

01=1,02=10,03=11

10& 01

(03 | 0)

| 11

print巨集:這個程式裡的「print」巨集需要用到c語言預處理器的「#」操作符和字串合併操作。這個「print」巨集有乙個形式引數int。在擴充套件的時候,形式引數int將被替換為巨集呼叫裡的實際引數。在形式引數的前面加上乙個「#」字元作為字首,將使得實際引數被括在一對雙引號裡。於是

print (x | y & z)

將被擴充套件為:

printf ("x | y & z" " = %dn", x | y & z)

c語言預處理器會自動將相鄰的字串合併,所以這又等價於:

printf ("x | y & z = %dn", x | y & z)

初始值:x=03,y=02,z=01 x | y & ~ z

(x | (y & ( ~ z)))

(x | (y & ~ 01))    「~」操作符對它的運算元按位求補,所以「0...01」將變成「1...10」。

(x | (02 & ~ 01))

(03 | 02)    在二進位制裡,

0...010

& 1...110

| 11

初始值:x = 03, y = 02, z = 01

x ^ y &;~z

(x ^ (y & (~z)))   這道謎題與前一題大同小異,只是把邏輯或操作符(|)換成了異或操作符(^)而已。

(x ^ (02 &~01))

(03 ^ 02)

1   在二進位制裡,

^ 11

初始值:x = 03, y = 02, z = 01

x & y && z

((x & y) && z)

((03 & 02) && z)

(02 && z)

(true && z)

(true && 01)

(true && true)

true, 即1  只有當兩個運算元都是true時,「&&」操作的結果才會是true。

初始值:x = 01

! x | x

((! x) | x)

((! true) | x)

(false | 01)

(0 | 01)

初始值:x = 01

~x | x

((~x)|x)

(~01|01)

-1   在二進位制裡,

1...110

| 0...001

1...111,即-1

(不管x的值是什麼,這道謎題的答案都是相同的。實際上,在使用二進位制補碼來表示負數的平台(如intel 8086系列或motorola 68000系列)上,這道謎題的答案永遠是-1;在使用1的補碼來表示負數的平台上,這道謎題的答案將是-0。在這本書裡,凡是涉及具體機器的謎題都使用二進位制補碼來表示負數。)

初始值:x = 01

x ^ x

(01 ^ 01)

0   在二進位制裡,

0...01

^ 0...01

0...00

(不管x的值是什麼,這道謎題的答案都是相同的)

初始值:x = 01

x <<= 3

x = 01 << 3

x = 8   在二進位制裡,

0000...01

1...111,也就是8。

從效果上看,每左移一位就相當於乘以2。

初始值:y = -01

y << = 3

y = -01 << 3

y = -8   在二進位制裡,

1111...11

<

1...11000,也就是-8。

初始值:y = -08

y >> = 3

y = -08 >> 3

這道謎題的答案似乎顯而易見:y=-1,可惜情況並非總是如此——有些計算機在進行右移操作時不保留運算元的符號位,而且c語言本身也不保證移位操作的結果在數學意義上肯定是正確的。不管怎樣,還是使用更為清晰的除以8的表達方式,即「y/8」。

c語言二進位制數表示 C語言位操作

了解位的基本概念 熟悉二進位制數的運算方法 掌握各種位運算的方法和技巧 熟悉位段的基本概念 掌握位段中資料的引用方法 掌握數值的轉換方法和技巧 c語言區別於其他語言的重要特點是支援位運算,使其能夠完成組合語言所能完成的大部分功能。在實際的程式設計中借助與位運算往往可以設計出簡潔的演算法,使程式簡化,...

二進位制操作

關於二進位制操作很常見,很多筆試面試題中也有涉及,本篇主要圍繞二進位制翻轉,二進位制最高位判定和給定整數的二進位制輸出來 靈活使用二進位制的 操作。一 給定整數的二進位制翻轉 思路 可以考慮逐次翻轉得到最終的翻轉結果,具體做法,首先將所有二進位制位奇偶位逐個翻轉,然後以兩位為一對 作為整體 奇偶對逐...

二進位制位運算

與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...