2014-02-25 53 views
2

例如,假設我有類似「0000 0000 0000 1110」的內容。如何訪問C中給定一個字節的特定位?

如何訪問最左邊的1並將其更改爲0?

+0

通常,對於像這樣的位變換黑客,諮詢[位操作黑客](http://graphics.stanford.edu/~seander/bithacks.html)。 –

回答

3

這兩個函數可以處理64位值。

uint8_t get_bit(uint64_t bits, uint8_t pos) 
{ 
    return (bits >> pos) & 0x01; 
} 

uint64_t set_bit(uint64_t bits, uint8_t pos, uint8_t value) 
{ 
    uint64_t mask = 1LL << (63 - pos); 
    if (value) 
     bits |= mask; 
    else 
     bits &= ~mask; 
    return bits; 
} 

uint64_t v = ...; 
uint8_t i = 63; 
for(;i>=0; i--) 
{ 
    if(get_bit(v, i)){ 
     v=set_bit(v,i, 0); 
     break; 
    } 
} 
+0

單線程得到設置爲1的msb:'i = floor(log(bits)/ log(2))' –

0

我認爲你正在尋找bit masking

例如:

00011001 >> 3 = 00000011 

現在用1

00000011 & 00000001 = 00000001 

碼掩碼是: -

int funcBitMasking(int8_t mybyte, int firstbit) 
{ 
    if (firstbit> 0 && firstbit<= 16) 
     return (mybyte & (1<<(firstbit-1))); 
    else 
     return 0; 
} 
1

使用按位和(&)。像0000 0000 0000 1110 & 0000 0000 0000 1000將給出非零答案

0

我假設你的輸入是32位。我們掃描輸入的第一個,左移;通過&改變的第一個位0與0X7FFF和數量右移我們左移荷蘭國際集團它+ 1

unsigned int i = 0XE; 
int j; 

for (j = 0; j < 32 && ! (i & 0X8000); j++) 
    i <<= 1; 

i &= 0X7FFF; 
i >>= (j + 1); 
0

假設= 0000 0000 0000 1110

int i =16 ; 
b = 1; 
while(true) 
{ 

    b = b << 1 ; 
    if(b & 0x1000000000000000) 
    { 
    break; 
    } 
i = i +1 ; 
} 

,你將有存取權限toyour有點像這樣

int yourbit= ~0; /* All 1’s */ 
youtbit = (max >> (i+1)) + 1 
0

我覺得你提到右邊的第四位是最左邊的位。可以使用Shift Operators

如果始終是要重置的1,則可以使用&操作。

但是,如果還可以取0的值,那麼&操作將失敗爲0 & 1 = 0。在此期間您可以使用| (OR)

將該值存儲在一個變量中並使用(1 << 4) 操作 Shift運算符的右側將從右側開始位的位置。並且,Shift運算符的左側將會將該值放置在該位置上。操作員指向方向,值必須移位。

請參考以下鏈接,瞭解更多信息。

http://www.eskimo.com/~scs/cclass/int/sx4ab.html

http://www.codeproject.com/Articles/2247/An-introduction-to-bitwise-operators

希望它幫助。

0
#include <stdio.h> 
#include <stdint.h> 

int mlb_pos(uint16_t x) {//0 origin 
    uint16_t y; 
    int n = 16; 
    y = x >> 8; if (y != 0){ n = n - 8 ; x = y; } 
    y = x >> 4; if (y != 0){ n = n - 4 ; x = y; } 
    y = x >> 2; if (y != 0){ n = n - 2 ; x = y; } 
    y = x >> 1; if (y != 0){ return 15-(n-2); } 
    return 15-(n-x); 
} 

int main(){ 
    uint16_t n = 14;//0b0000000000001110 
    uint16_t result = n^(1<<mlb_pos(n)); 
    printf("%d\n", result);//6 : 0b0000000000000110 
} 
相關問題