Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] программа по выделению битов


Автор: davik 24.12.2017, 14:27
Задача такова дано 8 байт 12 34 56 AB CD 13 25 36  из каждого байта нужно взять 2 бит и из этих вторых битов составить конечный байт порядок вторых битов такой - 2 бит восьмого байта будет 1 битом нового байта, 2 бит седьмого байта будет вторым битом нового байта..................... 2 бит 1байта будет восьмым битом нового байта, в результате должен получиться байт 14. Сам че то ни как не осилю, совсем еще новичек

Автор: JAPH 27.12.2017, 13:33
Мда, если бы не пример, я бы не понял условия. Биты нумеруются в другом порядке: самый младший имеет номер 0, самый старший в байте - номер 7.

Код
#define N 8
unsigned char bytes [N] = { 0x12, 0x34, 0x56, 0xAB, 0xCD, 0x13, 0x25, 0x36 };
int main () {
    unsigned result = 0;
    for (int i = 0; i < N; i++) result = (result >> 1) | ((0x40 & bytes[i]) << 1);
    return result;
}

Автор: davik 30.12.2017, 12:58
Очень помогли, а если последовательность будет вот такой :
1 бит 5 байта становится 0 битом нового байта
1 бит 1 байта становится 1 битом нового байта
1 бит 6 байта становится 2 битом нового байта
1 бит 2 байта становится 3 битом нового байта
1 бит 7 байта становится 4 битом нового байта
1 бит 3 байта становится 5 битом нового байта
1 бит 8 байта становится 6 битом нового байта
1 бит 4 байта становится 7 битом нового байта
это тоже можно в цикл загнать?





Автор: JAPH 31.12.2017, 20:03
Конечно, можно smile

Код
#include <unistd.h>
typedef struct {
    size_t byteNumber;
    unsigned bitNumber;
} BitSource;
unsigned char bytes [] = { 0x12, 0x34, 0x56, 0xAB, 0xCD, 0x13, 0x25, 0x36 };
BitSource bits [] = {
    { 4, 1 },
    { 0, 1 },
    { 5, 1 },
    { 1, 1 },
    { 6, 1 },
    { 2, 1 },
    { 7, 1 },
    { 3, 1 }
};
int main () {
    unsigned result = 0;
    for (size_t i = 0; i < sizeof(bits) / sizeof(bits[0]); i++) result |= ((bytes[bits[i].byteNumber] >> bits[i].bitNumber) & 1) << i;
    return result;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)