2009-09-19 36 views
8

Tôi có giá trị Int64, nhưng tôi chỉ cần 32 bit thấp hơn. Vì vậy, tôi muốn có một cách nhanh chóng để có được giá trị Int32 từ 32 bit thấp hơn của giá trị Int64.Tôi muốn có 32 bit int64 thấp như int32

Cảm ơn

+4

ngôn ngữ nào? vui lòng thêm đúng thẻ –

+1

Tôi không hiểu cách mọi người có thể trả lời câu hỏi này mà không biết ngôn ngữ. – pseudocoder

Trả lời

5

Đỗ một cái gì đó như thế này:

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); 

Điều này có thể không phải là cách nhỏ gọn nhất để làm điều đó, nhưng nó có vẻ là dễ đọc nhất đối với tôi. Đoạn mã dưới đây sẽ trích xuất một nửa cao của lâu:

long tempLong = (int)(yourLong >> 32); 
+7

Tùy thuộc vào trình biên dịch tối ưu hóa tốt như thế nào, mẫu mã đầu tiên của bạn có thể chậm hơn đáng kể so với chỉ truyền. Cá nhân, tôi cũng không thấy nó rõ ràng. –

+1

để không ra 32 bit thấp, sử dụng 'yourLong & 0xFFFFFFFF00000000' hoặc' yourLong & (~ 0ULL << 32) ', nhưng để có được các bit thấp, chỉ cần một nhiệm vụ đơn giản vì đầu sẽ luôn bị cắt ngắn, nó trình biên dịch cảnh báo việc sử dụng một diễn viên 'yourInt = (int) yourLong' –

9

Bạn không chỉ định ngôn ngữ, nhưng trong nhiều, tất cả những gì bạn cần làm là truyền sang Int32. Các bit trên cùng sẽ bị loại bỏ.

24

Nếu bạn gán một giá trị Int64 thành một giá trị int32, trình biên dịch sẽ tự động làm điều đó cho bạn
(như Steven Sudit đề cập):

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

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

và bởi vì trình biên dịch có thể hiển thị cảnh báo bạn có thể chỉ định các diễn viên

val32 = (int32)val64; 
1

bạn có thể để cho các trình biên dịch xử lý các endian-Ness, và ẩn tất cả các chuyển dịch bit, con trỏ thao tác, vv

DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){ 
    ULARGE_INTEGER uli; 
    uli.QuadPart = in64; 
    return uli.LowPart; 
} 
+0

Thêm 4 dấu cách trước mã của bạn để mã được định dạng đúng. – DanM7

+0

Hoặc, chọn khối mã của bạn và nhấn Ctrl-K. – SiKing

+0

Ý của bạn là "ConvertUint64toUint32"? – Quest

-1

Trong C/C++ cách tốt nhất (theo ý kiến ​​của tôi) là sử dụng một công đoàn. Ví dụ, hàm sau sử dụng một liên kết ẩn danh để trích xuất các bit 32 bit thấp hơn từ một số nguyên 64 bit.

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

Mẹo liên kết này có thể được sử dụng cho tất cả mọi thứ, như nhận bit của giá trị dấu phẩy động vào số nguyên có cùng độ dài bit, ví dụ: để thực hiện các thao tác bitwise và các hack khác.

Các vấn đề liên quan