Я хочу получить низкие 32 бита int64 как int32

"Более тихий наполовину" не довольно корректно. Из-за логарифмического ответа уха, разделяя образцы пополам сделает это на 6 дб более тихим - конечно, примечательный, но не имеющий катастрофические последствия.

Вы могли бы хотеть пойти на компромисс путем умножения на 0,75. Это сделает это на 3 дб более тихим, но уменьшит шанс переполнения и также уменьшит искажение, когда это действительно произойдет.

10
задан qingsong 19 September 2009 в 05:04
поделиться

3 ответа

Сделайте что-нибудь вроде этого:

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);
6
ответ дан 3 December 2019 в 13:47
поделиться

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

9
ответ дан 3 December 2019 в 13:47
поделиться

Если вы присвоите значение 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;
27
ответ дан 3 December 2019 в 13:47
поделиться