2015-10-07 42 views
2

是否可以定義一個例如60位的位數組(它不能被8整除)?是否可以定義一個自定義大小的位數組

bit_array = malloc(/*What should be here?*/) 

所有我發現定義比特串像

bit_array = malloc(sizeof(long)) 

但這只是給32位(取決於架構)

感謝

+0

我不這麼認爲。 'malloc'只有字節的概念。在位級別發生的是實現定義。 –

+2

C沒有這樣的「位陣列」的概念。您可以分配字節。如果你想要7位,那麼你必須分配一個完整的字節並且只使用它的一部分。 – immibis

+0

如果你想使用一個*字段*,它必須作爲結構的一部分來完成。 –

回答

2

這裏的代碼,我寫了從內部操縱位數組。在我的代碼中,我從堆棧中分配了60個字節的內存,爲您提供了480個位。然後,您可以使用setbit函數將60個字節內的任何位設置爲0或1,並使用getbit來查找某個位的值。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int getbit(unsigned char *bytes,int bit){ 
    return ((bytes[(bit/8)] >> (bit % 8)) & 1); 
} 

void setbit(unsigned char *bytes,int bit,int val){ 
    if (val==1){ 
     bytes[(bit/8)] |= (1 << (bit % 8)); 
    }else{ 
     bytes[(bit/8)] &= ~(1 << (bit % 8)); 
    } 
} 

int main(int argc, char **argv) { 
    unsigned char ab[60]; // value must be the ceiling of num of bits/8 
    memset(ab,0,60); // clear the whole array before use. 

    //A 
    setbit(ab,6,1); 
    setbit(ab,0,1); 

    //B 
    setbit(ab,14,1); 
    setbit(ab,9,1); 

    //C 
    setbit(ab,22,1); 
    setbit(ab,17,1); 
    setbit(ab,16,1); 

    //Change to B 
    setbit(ab,16,0); 

    printf("ab = %s\n",ab); 
    printf("bit 17 = %d\n",getbit(ab,17)); 

    return 0; 
} 

此URL的代碼更片段位操作:

How do you set, clear, and toggle a single bit?

+0

非常感謝,這真的很有幫助 –

相關問題