Как поместить биты в массив символов - PullRequest
0 голосов
/ 05 марта 2010

Мне нужно знать, как поместить биты в массив символов.

например,

Я хочу поместить 0001 бит в массив символов, используя C или C ++.

Нужна ваша помощь, ребята. Спасибо.

Ответы [ 4 ]

2 голосов
/ 05 марта 2010

Может быть, этот более общий код даст вам идею:

void setBitAt( char* buf, int bufByteSize, int bitPosition, bool value )
{
    if(bitPosition < sizeof(char)*8*bufByteSize)
    {
        int byteOffset= bitPosition/8;
        int bitOffset = bitPosition - byteOffset*8;

        if(value == true)
        {
            buf[byteOffset] |=  (1 << bitOffset);
        }
        else
        {
            buf[byteOffset] &= ~(1 << bitOffset);;
        }
    }
}

//use it as follow:
char chArray[16];
setBitAt(chArray,16*sizeof(char),5,true); //to set bit at pos 5 to 1
2 голосов
/ 05 марта 2010

Это действительно все?

char buf[1];
buf[0] = char(1);

Если вы хотите маскировать биты, это будет что-то вроде

enum Enum
{
    MASK_01 = 0x1,
    MASK_02 = 0x2,
    MASK_03 = 0x4,
    MASK_04 = 0x8,
};

char buf[4];
buf[0] = Enum::MASK_01;
buf[1] = Enum::MASK_02;
buf[2] = Enum::MASK_03;
buf[3] = Enum::MASK_04;

Если вы предоставите информацию о том, что вы на самом деле пытаетесь сделать, возможно, мы сможем вам помочь.

РЕДАКТИРОВАТЬ: Спасибо за дополнительную информацию. Помогает ли это:

enum Enum
{
    BIT_0000000000000001 = 0x0001,
    BIT_0000000000000010 = 0x0002,
    BIT_0000000000000100 = 0x0004,
    BIT_0000000000001000 = 0x0008,
    BIT_0000000000010000 = 0x0010,
    BIT_0000000000100000 = 0x0020,
    BIT_0000000001000000 = 0x0040,
    BIT_0000000010000000 = 0x0080,
    BIT_0000000100000000 = 0x0100,
    BIT_0000001000000000 = 0x0200,
    BIT_0000010000000000 = 0x0400,
    BIT_0000100000000000 = 0x0800,
    BIT_0001000000000000 = 0x1000,
    BIT_0010000000000000 = 0x2000,
    BIT_0100000000000000 = 0x4000,
    BIT_1000000000000000 = 0x8000,
};


int main( int argc, char* argv[] )
{
    char someArray[8];
    memset( someArray, 0, 8 );

    // create an int with the bits you want set
    int combinedBits =  BIT_0000000000000001|
                        BIT_0000000000000010|
                        BIT_1000000000000000;

    // clear first two bytes
    memset( someArray, 0, 2 );

    // set the first two bytes in the array
    *(int*)someArray |= combinedBits;

    // retrieve the bytes
    int retrievedBytes = *(int*)someArray;

    // test if a bit is set
    if ( retrievedBytes & BIT_0000000000000001 )
    {
        //do something
    }
}

Теперь названия перечислений намеренно интенсивны для ясности. также вы можете заметить, что в перечислении есть только 16 бит, вместо возможных 32 для целого числа. Это потому, что вы упомянули первые два байта. Используя этот метод, только первые два байта массива будут изменены, используя эти перечисления. Я не уверен, что этот код будет испорчен порядком байтов, поэтому вам нужно будет убедиться, что вы тестируете на своих машинах. НТН.

0 голосов
/ 13 марта 2010

C не поддерживает двоичные литералы, поэтому вам придется представлять значение в шестнадцатеричном виде.

char *p;

*p++ = 0x10;
*p++ = 0xFE;

Посмотрите на функции hton() и htonl() для преобразования многобайтовыхзначения в сетевой порядок байтов.

0 голосов
/ 05 марта 2010

Вы помещаете биты в массив символов с помощью C или C ++ так же, как вы помещаете что-либо во что-либо еще - они все равно являются битами.

Поскольку sizeof(char) == 1 по определению, вы можете поместить только 8 бит на элемент массива.

Если вам нужна помощь в том, как переворачивать биты, это совершенно другая проблема, и она не имеет ничего общего с char s и массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...