У меня есть массив с 16 элементами. Я хотел бы оценить их до логического 0 или 1, а затем сохранить это в 2 байта, чтобы я мог записать в двоичный файл. Как мне это сделать?C: Построение байт
ответ
Нечто подобное вы имеете в виду?
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.
точно так, спасибо –
Вы должны использовать 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 */
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;
}
Объявляем массив 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]++;
}
}
Почему downvote? Если вы не скажете, что вам не нравится, это совершенно бессмысленно. – Guffa
Я не голосовал никоим образом, но я предполагаю, что это потому, что вы используете массив, и вы даже не упоминаете его тип. Я предполагаю, что это массив символов, но ОП может этого не знать. В любом случае, вы можете сделать это без массива. Есть ли причина, по которой вы решили использовать массив? – IVlad
@IVlad: OP специально запросил два байта, логический способ их хранения находится в массиве.Тип данных может быть любым, что может обрабатывать байты, но char будет очевидным выбором. – Guffa
Что-то вроде этого.
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;
Какой смысл использовать '!!'? Простой оператор 'if' облегчает чтение. Кстати, ваш 'for' цикл не компилируется. – IVlad
оператор if добавляет ветвь во внутренний цикл. –
Сладкий. предложите более оптимальный раствор и за него занимитесь! Благодаря LVlad! –
Это решение избежать использование, если внутри цикла:
unsigned short binary = 0, i;
for (i = 0; i < 16; ++i)
binary |= (array[i] != 0) << i;
Это означает, что петля сдвигает нули слева и/или результат в «двоичный», тогда как решение IVlad обрабатывает только установочные биты. Непонятно, на значительной конвейерной архитектуре, где преимущество, но номинально меньшее количество операций для массива со многими нулями является преимуществом. –
- 1. MemoryStream и построение массива байт
- 2. байт [] в байт [INT] - C#
- 3. C# - преобразовать небезопасный байт * в байт []
- 4. Преобразовать байт в байт * [] в C#
- 5. Объект байт [] в байт [] в C#
- 6. Построение помощника Linq C#
- 7. Построение POST в C#
- 8. Построение исключения в C#
- 9. Построение строки в C
- 10. Построение объектов в C++
- 11. Построение с C
- 12. Построение векторов в C++
- 13. Построение с C#
- 14. C#: динамически построение переменных
- 15. C# построение общего метода
- 16. C++ символ * и C# байт
- 17. C++ создать пустой байт
- 18. C# байт сравнения массива
- 19. C++ Вывести байт Разъяснение
- 20. C - Зачистка младших байт
- 21. C# смещаться массив байт
- 22. C# INT преобразования байт
- 23. C# байт дополнение переполнение?
- 24. C# Байт-конвертации
- 25. Байт типа в C#
- 26. Преобразование байт в C#
- 27. Построение формулы C++ для доморощенного
- 28. C++ - построение объекта внутри класса
- 29. Построение таблицы из строки C#
- 30. Построение вызова функции в C
почему это время upvoted? – 2010-03-06 20:04:53
@Ниль, почему ты спрашиваешь? Вероятно, ОП не знает о побитовых операциях. –
@Nick Идея опроса заключается в том, что они должны в некотором смысле расширять понимание языка/технологии underling. Этот вопрос не означает, что просто вопрос о том, что вопрос никогда не должен быть поводом для повышения. – 2010-03-06 20:28:48