LINUX.ORG.RU

Вопрос по битовым операциям.


0

0

Как мне найти все число, если я знаю 4 его байта, наример: 0 байт = 0 1 байт = 0 2 байт = 3 3 байт = 133

3 = 11b 133 = 10000101b Следовательно это число равно 1110000101b = 901. Как мне реализовать на Сях эти все вычисления? Заранее спасибо, и не пинайте новичка за глупый вопрос :)

anonymous

Re: Вопрос по битовым операциям.

Ну самый общий вариант: int n = byte3 + byte2*256 + byte1*65536 + byte0*16777216. В Сях можно так сделать:

unsigned char arr[4];

arr[0] = byte3;

arr[1] = byte2;

arr[2] = byte1;

arr[3] = byte0;

int n = *(int*)arr;

Это для инетлловской архитектуры, где младшие байты лежат в младших адресах.

AVI ()

Re: Вопрос по битовым операциям.

Э, ну, люди... Это всего-лишь нечто вроде

unsigned int byte1, byte2, byte3, byte4, result;

byte1 = 0; byte1 = 0; byte2 = 3; byte3 = 133;

result = (byte3<<24) + (byte2<<16) + (byte1<<8) + (byte0);

либо, для другого порядка байтов в int-е:

result = (byte0<<24) + (byte1<<16) + (byte2<<8) + (byte3);

Просто и быстро, только к unsigned надо привести составляющие части - иначе будет колбасить понимаешь.. ;)

sseREGa ()
Ответ на: Re: Вопрос по битовым операциям. от sseREGa

Re: Re: Вопрос по битовым операциям.

неа, ананас пральна сказал - юнион лучше (быстрее):

  union {
    char[4] c;
    int i; // есно, для 4-байтового
  } u;
#if __BYTE_ORDER == __LITTLE_ENDIAN
  u.c[0]=byte3;
  u.c[1]=byte2;
  u.c[2]=byte1;
  u.c[3]=byte0;
#elif __BYTE_ORDER == __BIG_ENDIAN
  u.c[0]=byte0;
  u.c[1]=byte1;
  u.c[2]=byte2;
  u.c[3]=byte3;
#else
# error "Unsupported byte order."
#endif
  result = u.i;

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.