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


Автор: andrew_121 27.8.2008, 17:47
Есть код на С++
Код

bool bit;
unsigned short curcode=0;
...
bit = curcode & 0x8000; // самый старший бит.

Я переписал этот код для С:
Код

unsigned int bit;
unsigned short curcode=0;
...
bit = curcode & 0x8000; // самый старший бит.

Но результат не верен. В чем проблема?

Автор: Sartorius 27.8.2008, 17:56
чего получилось то?
лучше имхо так. Для замены bool
Код

unsigned int bit;
unsigned short curcode=0;
...
bit = (curcode & 0x8000) != 0; // самый старший бит.

Автор: andrew_121 27.8.2008, 18:26
Sartorius, Спасибо помогло!

Автор: andrew_121 27.8.2008, 19:02
И еще вопрос:
В С++
Код

FILE* f;
UCHAR CurByte=0;//работает как буффер
UCHAR CurBit=8;//чтобы при первом прочтении

bool Read1Bit() {
    if(CurBit==8) {
        ReadByte();
        CurBit=0;
    }
    return CurByte&(1<<(7-(CurBit++)));

}

void AddBit(long &l) { //читает один бит и добавляет его справа к l
    l<<=1;
    l+=Read1Bit();
}

long ReadBits(UCHAR NumBits) { //читает NumBits битов из файла
    long l=0;
    for(UCHAR i=0;i<NumBits;i++)
        AddBit(l);
    return l;
}

Проблема с функцией Read1Bit()
Как поправиь код для С ?

Автор: mes 27.8.2008, 19:17
может так ?
return ( CurByte&(1<<(7-(CurBit++))) !=0)? true:false;

Автор: andrew_121 27.8.2008, 19:19
mes, Нет. Проблема в том что функция возвращает bool. А в С, нет такого типа.

Автор: mes 27.8.2008, 20:04
Цитата(andrew_121 @  27.8.2008,  19:19 Найти цитируемый пост)
mes, Нет. Проблема в том что функция возвращает bool. А в С, нет такого типа. 


unsigned int  Read1Bit() { ...   return CurByte&(1<<(7-(CurBit++))) != 0; }

Добавлено через 6 минут и 49 секунд
или
unsigned int  Read1Bit() { ...   return (CurByte>>(7-(CurBit++))&1) ; }

Автор: Alek86 28.8.2008, 09:56
<удалено>

Автор: andrew_121 28.8.2008, 11:36
mes, Блин... Что-то неверно. Есть варианты?

Автор: UnrealMan 28.8.2008, 12:20
Цитата(andrew_121 @  27.8.2008,  20:19 Найти цитируемый пост)
Проблема в том что функция возвращает bool. А в С, нет такого типа. 

В C99 предусмотрены стандартные макросы для bool, true и false, которые определены в stdbool.h

Цитата(andrew_121 @  28.8.2008,  12:36 Найти цитируемый пост)
mes, Блин... Что-то неверно. Есть варианты?

Просто кому-то надо выучить приоритеты операций. Правильно будет

Код

return ( CurByte&(1<<(7-(CurBit++))) ) != 0;

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