2012-05-03 2 views
0

Как вырезать из длинных N бит, чтобы получить int и cout (и получить читаемый int)? СтараюсьКак вырезать из длинных N бит, чтобы получить int и cout (и получить читаемый int)?

int count = sizeof(long) - sizeof(int); 
    int int_val =(long_val>> (sizeof(long) - count)); 

Но получить horible COUT ... Что мне делать - как вырезанные из длинных N битов, чтобы получить Int и COUT его (и получить читаемый Int)?

+1

Предполагая, что 'long' длиннее' int' (whi ch - плохое предположение; они часто имеют одинаковую длину), какие биты вы хотите: высокие или низкие? –

+0

Обратите внимание, что ваша величина сдвига равна 'sizeof (l) - (sizeof (l) - sizeof (i))'; если 'long' - 64 бита, а' int' - 32 бита, то есть '32'; если 'long' и' int' равны 32 битам, результат равен _still_ '32'. Но в последнем случае это кажется неправильным ... – sarnold

+0

[Какова основная проблема, которую вы пытаетесь решить здесь?] (Http://meta.stackexchange.com/questions/66377/what-is-the-xy- проблема) – Johnsyweb

ответ

0

Чтобы получить более низкие N битов, попробуйте (long_val & ((1<<(N-1)) - 1))

0

Есть две проблемы с оригинальным кодом:

  1. Оператор sizeof работает с единицами байт, но оператор >> работает с единиц бит.

  2. Вы перешли на sizeof(long) - sizeof(long) + sizeof(int), что могло быть правильным только случайно.

Если вы хотите получить байт низкого порядка в портативном образом, вы можете использовать:

unsigned int_val = (unsigned) (long_val & UINT_MAX); 
1

Попробуйте следующее (неоптимизированная):

#include <limits> 
#include <iostream> 

using namespace std; 

int lowerBits(long in) { 
    // use unsigned so that sign bit is not propagated 
    // when compiler casts it to a long 
    return in & (unsigned) -1; 
} 

int upperBits(long in) { 
    return lowerBits(in >> numeric_limits<unsigned int>::digits); 
} 

int main(int, char **) { 
    cout << hex << lowerBits(0x4321432112341234) << endl; 
    cout << hex << upperBits(0x4321432112341234) << endl; 
} 

выход на 64 бит, используя gcc:

12341234 
43214321 
Смежные вопросы