謎題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 按...