С ++ сдвигающиеся биты - PullRequest
       12

С ++ сдвигающиеся биты

3 голосов
/ 15 марта 2010

Я плохо знаком со сдвигающимися битами, но пытаюсь отладить следующий фрагмент:

if (!(strcmp(arr[i].GetValType(), "f64")))
 {
        dem_content_buff[BytFldPos] = tmp_data;
     dem_content_buff[BytFldPos + 1] =  tmp_data >> 8;
     dem_content_buff[BytFldPos + 2] = tmp_data >> 16;
     dem_content_buff[BytFldPos + 3] = tmp_data >> 24;
     dem_content_buff[BytFldPos + 4] = tmp_data >> 32;
     dem_content_buff[BytFldPos + 5] = tmp_data >> 40;
     dem_content_buff[BytFldPos + 6] = tmp_data >> 48;
     dem_content_buff[BytFldPos + 7] = tmp_data >> 56;
        }    

Я получаю предупреждение о том, что строки с «32» по «56» имеют слишком большое число смен. «F64» в предикате означает, что данные должны быть 64-битными.

Как это сделать?

редактирование:

Я должен был добавить больше кода.

tmp_data = simulated_data[index_data];

if (!(strcmp(dems[i].GetValType(), "s32")))

{ dem_content_buff [BytFldPos] = tmp_data; dem_content_buff [BytFldPos + 1] = tmp_data >> 8; dem_content_buff [BytFldPos + 2] = tmp_data >> 16; dem_content_buff [BytFldPos + 3] = tmp_data >> 24;
}

if (! (Strcmp (dems [i] .GetValType (), "f64"))) { dem_content_buff [BytFldPos] = tmp_data; dem_content_buff [BytFldPos + 1] = tmp_data >> 8; dem_content_buff [BytFldPos + 2] = tmp_data >> 16; dem_content_buff [BytFldPos + 3] = tmp_data >> 24; dem_content_buff [BytFldPos + 4] = tmp_data >> 32; dem_content_buff [BytFldPos + 5] = tmp_data >> 40; dem_content_buff [BytFldPos + 6] = tmp_data >> 48; dem_content_buff [BytFldPos + 7] = tmp_data >> 56; }

Итак, dem_content_buff сейчас содержит только целые числа. Могу ли я также не использовать этот массив для 64-битных данных?

Ответы [ 4 ]

2 голосов
/ 15 марта 2010

Какой тип tmp_data?

Я предполагаю, что tmp_data только 32-битный, следовательно, ошибка. Это должен быть 64-битный тип unsigned int, который может быть достигнут с использованием нестандартного (но хорошо поддерживаемого) типа данных unsigned long long.

1 голос
/ 15 марта 2010

Если вы используете Visual Studio, убедитесь, что вы определили tmp_data как:

__int64 tmp_data;              // Visual studio version

вместо

unsigned long long tmp_data;   // GCC version
1 голос
/ 15 марта 2010

Чтобы оператор сдвига работал, сдвигая более 32 бит, tmp_data должен быть 64-битным типом - как указано в нескольких других ответах.

Однако вы также хотели бы, чтобы simulated_data был массивом некоторого 64-битного типа, в противном случае tmp_data всегда будет нулем (или расширенным знаком 1 бит) в старших значащих битах, когда вы присвоить его первоначальное значение:

tmp_data = simulated_data[index_data];
1 голос
/ 15 марта 2010

Убедитесь, что вы используете 64-битный тип long для tmp_data, как было предложено до того, как не сгенерированный long long должен работать, но проверьте документацию вашего компилятора и архитектуры.

Код должен выглядеть следующим образом.Также убедитесь, что ваш demp_content_buff объявлен как unsigned char * или unsigned char [].

Затем измените свой код на:

if (!(strcmp(arr[i].GetValType(), "f64")))
    {
        dem_content_buff[BytFldPos] =  ( tmp_data & 0xff );
        dem_content_buff[BytFldPos + 1] =  (tmp_data >> 8 ) & 0xff ;
        dem_content_buff[BytFldPos + 2] =  (tmp_data >> 16) & 0xff ;
        dem_content_buff[BytFldPos + 3] =  (tmp_data >> 24) & 0xff;
        dem_content_buff[BytFldPos + 4] =  (tmp_data >> 32) & 0xff;
        dem_content_buff[BytFldPos + 5] =  (tmp_data >> 40) & 0xff;
        dem_content_buff[BytFldPos + 6] =  (tmp_data >> 48) & 0xff;
        dem_content_buff[BytFldPos + 7] =  (tmp_data >> 56) & 0xff;
        }   
...