2010-08-30 15 views
8

tôi có một số hoạt động hình ảnh/kết cấu ở mức độ thấp, nơi màu 32 bit được lưu trữ dưới dạng UInt32 hoặc int và tôi cần một chuyển đổi bitwise thực sự nhanh chóng giữa hai.Cách nhanh nhất để truyền int tới UInt32 bitwise?

ví dụ:

int color = -2451337; 

//exception 
UInt32 cu = (UInt32)color; 

bất kỳ ý tưởng nào?

cảm ơn và liên quan

Trả lời

21
int color = -2451337; 
unchecked { 
    uint color2 = (uint)color; 
    // color2 = 4292515959 
} 
+0

đẹp! chỉ là những gì tôi đang tìm kiếm .. cảm ơn !! – thalm

7
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0) 
+2

+1 để bù đắp phần ghi đè. Ngay cả trước khi chỉnh sửa của tôi không có gì là quan trọng sống còn quan trọng sai với câu trả lời này. Trong thực tế, đây sẽ là phương pháp ưu tiên nếu sử dụng VB vì các phôi trực tiếp từ Int32 đến UInt32 và các bối cảnh không được kiểm tra chi tiết không được phép. –

+0

Làm thế nào để so sánh hiệu suất với một cái gì đó như UiValue = CUInt (IntValue & 0xFFFFFFFF &)? – supercat

0

Những người sử dụng một ngôn ngữ như VB, mà không có một cách thực sự thuận tiện của việc vô hiệu hóa kiểm tra tràn trong việc chuyển đổi, có thể sử dụng một cái gì đó như:

 
    Shared Function unsToSign64(ByVal val As UInt64) As Int64 
     If (val And &H8000000000000000UL) 0 Then Return CLng(val Xor &H8000000000000000UL) Xor &H8000000000000000 Else Return CLng(val) 
    End Function 
    Shared Function signToUns64(ByVal val As Int64) As UInt64 
     If val < 0 Then Return CULng(val Xor &H8000000000000000) Xor &H8000000000000000UL Else Return CULng(val) 
    End Function 

hoặc

 
    Shared Function unsToSign(ByVal val As UInt64) As Int64 
     Return CLng(val And &H7FFFFFFFFFFFFFFFUL) + (CLng(-((val And &H8000000000000000UL) >> 1)) << 1) 
    End Function 
    Shared Function signToUns(ByVal val As Int64) As UInt64 
     Return CULng(val And &H7FFFFFFFFFFFFFFF) + (CULng(-((val And &H8000000000000000) >> 1)) << 1) 
    End Function 

Phiên bản cho 32 bit sẽ rất giống nhau. Tôi không chắc cách tiếp cận nào sẽ nhanh hơn. Những thay đổi là một chút ngớ ngẩn, nhưng họ tránh sự cần thiết cho các xét nghiệm 'nếu'.