2015-04-02 50 views
5

我現在知道它是如何在一行中完成的,儘管我沒有意識到爲什麼我的初稿不起作用。我想要做的是將下半部分保存到一個不同的變量中,將高字節移到右側並通過OR添加兩個數字。但是,它只是削減十六進制的下半部分並返回其餘部分。用較高的一個(8-15)一個交換低位字節(0-7)

short int method(short int number) { 


short int a = 0; 
for (int x = 8; x < 16; x++){ 
    if ((number & (1 << x)) == 1){ 
     a = a | (1<<x); 
    } 
} 

    number = number >> 8; 

short int solution = number | a; 
return solution; 
+0

謹防移位簽名變量:符號位可能導致未定義的行爲。更好使用無符號數,或在轉換之前轉換爲無符號數。 – 2015-04-02 15:40:37

+0

你正在做一個有符號(短)int的右移 - 這會導致實現定義的行爲(通常是算術移位)。使用無符號(短)整數來避免這個問題。 – 2015-04-02 15:40:44

+0

在調試器中跟蹤這一點,逐步執行一條指令,並檢查每個變量的值。 – abelenky 2015-04-02 15:41:05

回答

4

if ((number & (1 << x)) == 1)

這隻會返回true,如果x爲0。由於1二進制爲00000000 00000001,並且1 << x是要設定所有,但第X個位爲0

你不不管它是否爲1,你只關心它是否爲非零。使用

if (number & (1 << x))

+2

如果設置了該位,該語句「返回」會是什麼? – taclight 2015-04-02 16:53:47

+0

'number&(1 << 8)'根據是否設置了第8位返回00000000 00000000或00000001 00000000。 'number&(1 << 9)'根據第9位是否被設置返回00000000 00000000或00000010 00000000。 'number&(1 << 10)'或者返回00000000 00000000或者00000100 00000000,這取決於第10位是否被設置,&ct&ct。 – QuestionC 2015-04-02 18:04:12

+0

因此,在任何情況下它都不會返回1。 – QuestionC 2015-04-02 18:05:35

8

你一次只做一點;一個更好的辦法是用一個單一的操作做到這一點:

uint16_t method(uint16_t number) { 
    return (number << 8) | (number >> 8); 
} 

上面的代碼指定的16位無符號類型明確,從而避免符號擴展相關的問題。你需要包含<stdint.h>(或用C++編寫的<cstdint>)才能編譯。