2013-10-05 28 views
-5

我是新來的C和學習逐位運算符CI是如何工作的要檢查是否有地址的最顯著設置或不我如何展示地址0x80至1 << 31二進制

int main() 
    { 

    int addr=0x0fffffff; 

    if(addr&0x80) 
    { 
     Printf("Bit is set"); 
    } 
    else 
    printf("Bit is not set"); 
    return 0; 
    } 

編輯:我想0x80被表示爲1000 0000 0000 0000 0000 0000 0000 0000,我在過去看過這樣的實現,不需要使用一些宏來編寫所有的位,但不能在其中回憶它?

+1

你爲什麼期望它給「位未設置」? 「0x80」等於128,並且該位肯定設置在「0x0fffffff」中。 –

+0

你爲什麼不試試? – marcadian

+0

好吧,這沒有任何意義。爲什麼不寫'(1 << 31)'或什麼的? – harold

回答

2

您的代碼 INT ADDR = 0x0fffffff; 和 if(addr & 0x80) 導致此情況始終爲真。

0x0fffffff => 0000 1111 1111 1111 .... 1111 1111 
where 0x80 =>       1000 0000 
------------------------------------------------- 
bitwise AND        1000 0000 -> non zero means true! 
+0

是@Hirofumo你是對的,但我想有什麼方法可以代表0x80爲1000 0000 0000 0000 0000 0000 0000 0000?手形式。 –

+0

如果你有興趣這樣做,然後更改'0x80'到'0x80000000' – haccks

+1

你可能陷入'endian'的陷阱。實際上,小端機器在32位格式中的值爲0x80,爲'80 00 00 00'。但是,它們也以相同的方式將0x0fffffff存儲爲'ff ff ff 0f':)。在通常的數字/邏輯計算中,您不必關心末端。 – HirofumiTamori

0

if(addr&0x80) 

條件addr&0x80成立(返回一個非零值if),它相當於

if(a nonzero value) // any nonzero value treated as true 

這就是爲什麼它是印刷Bit is set

+0

0x80在二進制將是1000 0000 0000 0000 0000 0000 0000 0000現在檢查它對0x0fffffff會給0。這種方式我想。 –

+4

誰告訴你'0x80'會是'1000 0000 0000 0000 0000 0000 0000 0000'? – haccks

+0

罰@haccks它不是,但想代表0x80爲1000 0000 0000 0000 0000 0000 0000 0000,我不想寫,如果我的條件像if(addr&0x80000000),我想我不能把我的問題正確的方式。 –

1

cnon zero值爲true。所以你的條件將是真實的。

你的條件將評估爲10000000b = 128 = true

+0

添加0bXXXX前綴到二進制數字或您的文章看起來垃圾;) – Skeen

1

您可以檢查是否通過使用掩碼〜(〜0U >> 1)設置最高有效位。下面是一些代碼改編自你:

#include <stdio.h> 

int main() { 
    int addr=0x0fffffff; 
    unsigned int mask = ~(~0U >> 1); 

    if (addr & mask) { 
     printf("Bit is set"); 
    } 
    else 
     printf("Bit is not set"); 
    return 0; 
} 

因爲你是新的C,面具看起來有點怪異,所以讓我們看看這裏發生了什麼:

〜0U是,每一個位無符號數設爲1:一元〜運算符否定0上的每一位,從而使得每一位1〜0U >> 1將它全部向右移動一位,所以現在你有(在32位機器上):

01111111111111111111111111111111 

再次否定它,這是〜(〜0U >> 1),得出:

10000000000000000000000000000000 

所以現在你有一個只有最重要的位設置的數字,這是用作測試其他數字的掩碼。

使用這種構造是可移植的,因爲您不依賴於數字的大小。無論int中有多少位,〜(〜0U >> 1)將始終工作。

該數字被聲明爲無符號的,因爲右移運算符可以在常規整數中導致符號擴展,我們不希望這樣。使用無符號數字,右移總是插入前導0。

+0

感謝Filipe對你的迴應,我們可以做一些這樣的事情嗎(addr&(1 << 31))? –

+1

您可以,但該代碼假設整數是32位,因此它不是便攜式的。 –

相關問題