2015-10-07 2 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 байтов в нуль или один, и использовать 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

Большое спасибо, это было действительно полезно –

Смежные вопросы