2014-04-01 93 views
0

我試圖檢查LSB的第二位是否被設置。 我使用下面的函數來做到這一點。 如果是第一位,我可以簡單地返回(uintptr_t) p & 1。 由於我正在檢查是否設置了第二位,我正在執行另一個操作==。 有沒有一種巧妙的方法可以用一條指令來實現呢?檢查是否設置了一個特定位

static inline bool is2ndBitSet(void* p) 
{ 
    return ((uintptr_t) p & 2) == 2; 
} 

編輯: 我只是想在評論中提出的建議,是的,我做的冗餘比較

#include<stdio.h> 
#include<stdint.h> 
static inline bool is2ndBitSet(void* p) 
{ 
    return ((uintptr_t) p & 2); 
} 

int main() 
{ 
    unsigned long* ptr = (unsigned long*) 0x4; 
    unsigned long* ptr1 = (unsigned long*) 0x3; 
    if(is2ndBitSet(ptr)) 
    { 
     printf("bit is set\n"); 
    } 
    else 
    { 
     printf("bit is not set\n"); 
    } 
    if(is2ndBitSet(ptr1)) 
    { 
     printf("bit is set\n"); 
    } 
    else 
    { 
     printf("bit is not set\n"); 
    } 
    return 0; 
} 

輸出

bit is not set 
bit is set 
+2

'p&2'?我錯過了什麼? – Kevin

+1

返回'int'並且具有零均值假,並且非零均值truth-y。那麼'p&2'完全有效。 – Kevin

+0

'p&2'將返回'2'而不是'1'。我可以返回int,但我想保持簡單,因此'bool'。 – arunmoezhi

回答

0
  • 除非你真的需要爲了使結果正常化,不需要使用bool並進行標準化。我認爲這是唯一的出路。 (直到編譯器獲得它。)C和C++只接受0作爲false,其他都是true。
    • 如果你使用bool而忽略正常化,編譯器會默默地執行它。
  • 你似乎認爲你知道該compiker將輸出什麼,但你不知道。不成熟的優化是萬惡之源,這是肯定的。
+0

'你似乎認爲你知道該輸出者會輸出什麼,儘管你不'。我在這裏錯過了什麼? – arunmoezhi

+0

簡單地說,就是使用正確的類型,專注於正確的算法並以正確的方式佈置數據。相信編譯器會得到你詢問的正確的細節,除非你得到它沒有的具體證據。 – Deduplicator

+0

我認爲當你沒有做通常使用指針的東西時,Deduplicator會質疑你對指針的使用。或者至少我是。 –

0

0代表FALSE 別的代表TRUE

做只是if (p & 2)if (p & 0x2)應該就好了。

PS

我剛纔輸入下同樣的事情用十六進制值的原因十六進制值從0到F的使用(連續4位)來表示設置在半字節/復位位它使事情更容易執行如果你在做一些操作很多。

+0

使用'if'是另一種做我做的事情的方式。 – arunmoezhi

+0

'if'部分只是爲了清晰起見。你是否嘗試過編譯和測試而不用'== 2'部分,看看會發生什麼? –

+0

我剛剛做了,它工作得很好。 '(uintptr_t)p&2' –

相關問題