Я хочу получить 32-разрядный бит 64 как Int32 - PullRequest
10 голосов
/ 19 сентября 2009

У меня есть значение Int64, но мне нужны только младшие 32 бита. Поэтому я хочу быстрый способ получить значение Int32 из младших 32 битов значения Int64.

Спасибо

Ответы [ 5 ]

27 голосов
/ 19 сентября 2009

Если вы назначите значение int64 в значение int32, компилятор автоматически сделает это за вас
(как упомянуто Стивен Судит ):

int64 val64 = ...;
int32 val32 = ...;
...

val32 = val64; // get the low 32 bits
// or
val32 = (val64 >> 32); // get the high 32 bits

и поскольку компилятор может отображать предупреждения, вы можете указать приведение

val32 = (int32)val64;
9 голосов
/ 19 сентября 2009

Вы не указали язык, но во многих все, что вам нужно сделать, это привести его к Int32. Старшие биты будут отброшены.

6 голосов
/ 19 сентября 2009

Сделайте что-то вроде этого:

long tempLong = ((yourLong >> 32) << 32); //shift it right then left 32 bits, which zeroes the lower half of the long
int yourInt = (int)(yourLong - tempLong);

Возможно, это не самый компактный способ сделать это, но мне он кажется наиболее читаемым Следующий код извлечет верхнюю половину длинной:

long tempLong = (int)(yourLong >> 32);
1 голос
/ 10 сентября 2014

Вы можете позволить компилятору обрабатывать порядок байтов и скрывать все битовые сдвиги, манипуляции с указателями и т. Д.

DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){
    ULARGE_INTEGER uli;
    uli.QuadPart = in64;
    return uli.LowPart;
}
0 голосов
/ 02 сентября 2017

В C / C ++ лучший способ (на мой взгляд) - использовать объединение. Например, следующая функция использует анонимное объединение для извлечения 32-разрядных младших разрядов из 64-разрядного целого числа.

uint32_t lower_32_bits(uint64_t value) {
    union { uint64_t value; struct { uint32_t high, low; }; } converter;
    converter.value = value;
    return converter.low;
}

Этот трюк объединения можно использовать для всех видов вещей, например, для получения битов значения с плавающей запятой в целое число с одинаковой длиной, например для выполнения побитовых операций и других хаков.

...