5.下列 C/C++程式片段執行後,z 的值為何? (假設 int 跟 unsigned int 皆為 32 位元)
(A) 3
(B)23
(C) 35
(D) 25
統計: A(19), B(76), C(80), D(36), E(0) #2978897
詳解 (共 4 筆)
我來補充一下B1說的:
0x123456782的2進制是
hex 1 2 3 4 5 6 7 8
bin 0001 0010 0011 0100 0101 0110 0111 1000
然後你再左移6位,再向他說的右移6位補0
0001 0010 0011 0100 0101 0110 0111 1000
->10 0011 0100 0101 0110 0111 1000 000000(左移6位)
->0000 0010 0011 0100 0101 0110 0111 1000(右移6位)
之後右移20位
0000 0010 0011 0100 0101 0110 0111 1000(框起來的部分是要移走的)
->0000 0000 0000 0000 0000 0000 0010 0011
就是16進制的23,10進制就是35
0001 0010 0011 0100 0101 0110 0111 1000
1000 1101 0001 0101 1001 1110 0000 0000
0000 0000 0000 0000 0000 0000 0010 0011
1+2+32=35
根據圖片中的C/C++代碼片段,bits 用於從一個整數中提取特定範圍內的位。這個宏將整數 i 中從位 a 到位 b 的位提取出來,並將它們放到最低位的位置。這裡,UINT32 定義為 unsigned int,意味著操作是在無符號32位整數上執行的。
bits(i,a,b) 內部的運作原理如下:
-
(i << (31-b)):首先將 i 向左移動 (31-b) 位,這會將從位 b 開始的位移動到整數的最高位。
-
>> (31-b+a):然後將上一步的結果向右移動 (31-b+a) 位,這會將從位 b 開始的位移動到整數的最低位,同時丟棄除了 b-a+1 位之外的所有位。
在這個特定的例子中,我們有 i = 0x12345678 和宏調用 bits(i,20,25)。這意味著我們想要提取 0x12345678 從第20位到第25位的位。
我們可以通過執行以下步驟來計算 z 的值:
- 確定 i 中的第20位到第25位。
- 將這些位移動到最低位的位置。
- 將其他位清零。 執行給定的C/C++代碼片段後,z 的值為 35。