C Побитовая операция Вопрос - PullRequest
0 голосов
/ 25 августа 2011

Может кто-нибудь помочь мне понять, что происходит с этим кодом. Похоже, что он делает целое число из массива битов. Я не уверен, как он это делает. Почему есть битовая операция & OxFF? Inst просто собирается дать тот же результат?

//first take the first  4 bytes read out of the socket into an array and
//make them a 32 bit integer

        long ltemp =0;
        long ltemp2 = 0;
        ltemp  = ltemp | (unsigned char)(analog_val_ptr[0] & 0xff);
        ltemp  = ltemp << 24;
        ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[1] & 0xff);
        ltemp2 = ltemp2 << 16;
        ltemp = ltemp2 | ltemp;
        ltemp2 =0;
        ltemp2 = ltemp2 | (unsigned char)(analog_val_ptr[2] & 0xff);
        ltemp2 = ltemp2 << 8;
        ltemp = ltemp2 | ltemp;
        ltemp  =  ltemp | (unsigned char)(analog_val_ptr[3] & 0xff);

///then convert that integer into a float, passing

Ответы [ 4 ]

3 голосов
/ 25 августа 2011

Это очень скучный способ простого преобразования четырех 8-битных байтов в 32-битный.

and с 0xff просто гарантирует, что используются только младшие 8 бит каждого значения (0xff == binary 11111111).

Сдвиг битов (кратный 8) предназначен для того, чтобы каждый символ находился в правильном положении.

Все это можно заменить на что-то вроде:

unsigned long ltemp  = (unsigned char)(analog_val_ptr[0] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[1] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[2] & 0xff);
ltemp = (ltemp << 8) | (unsigned char)(analog_val_ptr[3] & 0xff);

Или, альтернативно (и при условии, что они доступны), использовать правильные инструменты для работы, в частности htonl() и ntohl().

1 голос
/ 25 августа 2011

похоже, что оно идет для независимого преобразования с порядком байтов.

1 голос
/ 25 августа 2011

Похоже, что он строит целое число из массива байтов . Может случиться так, что analog_val_ptr[] - это массив значений int или short, и этот код предназначен для обработки каждой записи как байта. Маскировка предназначена для предотвращения переполнения целевого значения знаковым битом.

0 голосов
/ 25 августа 2011
var = 0x ? ? ? ? ? ? ? ?
         & & & & & & & & 
      0x 0 0 0 0 0 0 f f 
      ------------------
         0 0 0 0 0 0 ? ?

После операции AND младшие 8 бит будут найдены с var & 0xff.Это способ вырезать только необходимую часть, маскируя.

Приведенный выше код просто вставляет младшие байты 4 элементов массива в переменную ltemp как long int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...