2010-03-06 4 views
1

У меня есть массив с 16 элементами. Я хотел бы оценить их до логического 0 или 1, а затем сохранить это в 2 байта, чтобы я мог записать в двоичный файл. Как мне это сделать?C: Построение байт

+0

почему это время upvoted? – 2010-03-06 20:04:53

+0

@Ниль, почему ты спрашиваешь? Вероятно, ОП не знает о побитовых операциях. –

+0

@Nick Идея опроса заключается в том, что они должны в некотором смысле расширять понимание языка/технологии underling. Этот вопрос не означает, что просто вопрос о том, что вопрос никогда не должен быть поводом для повышения. – 2010-03-06 20:28:48

ответ

4

Нечто подобное вы имеете в виду?

unsigned short binary = 0, i; 
for (i = 0; i < 16; ++i) 
    if (array[i]) 
    binary |= 1 << i; 

// the i-th bit of binary is 1 if array[i] is true and 0 otherwise. 
+0

точно так, спасибо –

2

Вы должны использовать bitwise operators.

Вот пример:

int firstBit = 0x1; 
int secondBit = 0x2; 
int thirdBit = 0x4; 
int fourthBit = 0x8; 

int x = firstBit | fourthBit; /*both the 1st and 4th bit are set */ 
int isFirstBitSet = x & firstBit; /* Check if at least the first bit is set */ 
2
int values[16]; 
int i; 
unsigned short word = 0; 
unsigned short bit = 1; 

for (i = 0; i < 16; i++) 
{ 
    if (values[i]) 
    { 
     word |= bit; 
    } 

    bit <<= 1; 
} 
1

Объявляем массив result с двумя байтами, то через цикл исходного массива:

for (int i = 0; i < 16; i++) { 
    // calclurate index in result array 
    int index = i >> 3; 
    // shift value in result 
    result[index] <<= 1; 
    // check array value 
    if (theArray[i]) { 
    // true, so set lowest bit in result byte 
    result[index]++; 
    } 
} 
+0

Почему downvote? Если вы не скажете, что вам не нравится, это совершенно бессмысленно. – Guffa

+0

Я не голосовал никоим образом, но я предполагаю, что это потому, что вы используете массив, и вы даже не упоминаете его тип. Я предполагаю, что это массив символов, но ОП может этого не знать. В любом случае, вы можете сделать это без массива. Есть ли причина, по которой вы решили использовать массив? – IVlad

+0

@IVlad: OP специально запросил два байта, логический способ их хранения находится в массиве.Тип данных может быть любым, что может обрабатывать байты, но char будет очевидным выбором. – Guffa

-1

Что-то вроде этого.

int values[16]; 
int bits = 0; 
for (int ii = 0; ii < 16; ++ii) 
{ 
    bits |= (!!values[ii]) << ii; 
} 

unsigned short output = (unsigned short)bits; 

выражение (!! значения [б]) заставляет значение быть 0 или 1, если вы точно знаете, что массив значений уже содержит либо 0 или 1, и ничего другого, вы можете оставить из !!

Вы также можете сделать это, если вам не нравится !! синтаксис.

int values[16]; 
int bits = 0; 
for (int ii = 0; ii < 16; ++ii) 
{ 
    bits |= (values[ii] != 0) << ii; 
} 

unsigned short output = (unsigned short)bits; 
+0

Какой смысл использовать '!!'? Простой оператор 'if' облегчает чтение. Кстати, ваш 'for' цикл не компилируется. – IVlad

+0

оператор if добавляет ветвь во внутренний цикл. –

+0

Сладкий. предложите более оптимальный раствор и за него занимитесь! Благодаря LVlad! –

2

Это решение избежать использование, если внутри цикла:

unsigned short binary = 0, i; 
for (i = 0; i < 16; ++i) 
    binary |= (array[i] != 0) << i; 
+0

Это означает, что петля сдвигает нули слева и/или результат в «двоичный», тогда как решение IVlad обрабатывает только установочные биты. Непонятно, на значительной конвейерной архитектуре, где преимущество, но номинально меньшее количество операций для массива со многими нулями является преимуществом. –

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