#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
// возвращает первый бит байта
inline int get_first_bit(char byte) { return byte%2; }
void print_bit(char bit)
{
for(int i = 7;i >= 0; --i)
cout << get_first_bit(bit >> i);
}
// возводит Int в степень n
int degree(int Int, int n)
{
int res = 1;
for(int i = 1; i < n; ++i)
res *= Int;
return res;
}
void main()
{
string buffer = "";
cout << "Write string: ";
cin >> buffer;
cout << endl;
int current_bit = 0;
long int Result = 0;
for(int i = 0; i < buffer.length(); ++i)
{
char buf = buffer;
print_bit(buf);
for(int j = 0; j < 8; ++j)
{
Result += get_first_bit(buf >> j) * degree(2, current_bit);
++current_bit;
}
}
cout << endl;
cout << "Result: " << Result << endl;
_getch();
}
Работа с байтами
задача такая: есть 2 байта, необходимо вычислить их значение вместе. Допустим первый байт 10110111, второй 11101011. С одним байтом справляюсь легко, просто перевожу его из типа char(в таком типе они хранятся в буфере) в int. А нужно посчитать значение 2 байт вместе, т.е. 1*2^0+0*2^1+1*2^2+... +1*2^14+1*2^15. Подскажите как это можно сделать???
Код:
get_first_bit и degree вынес отдельно для наглядности.
п.с. кол-во бит для обработки не ограничено, но переполнения Result никто не отменял, так что учти это...
Цитата: S1avik
...из типа char...
2Norgat
Имели ввиду по всей видимости два байта которые расположены в ячейках типа char.
В таком случае:
Код:
char byte1 = 0x11;
char byte2 = 0x22;
short r = byte1 | (byte2 << 8);
char byte2 = 0x22;
short r = byte1 | (byte2 << 8);
в результате r == 0x2211
Цитата: S1avik
...в таком типе они хранятся в буфере...
А шо мешает
Код:
char *buf;
...
short r = *(short*)&buf[...];
...
short r = *(short*)&buf[...];
или
Код:
char *buf;
...
short *buf2 = (short*)buf;
...
...
short *buf2 = (short*)buf;
...
?
спасибо!