Самый быстрый способ представлять int32 побитовые?
Вопрос
У меня есть некоторые операции изображения / текстуры низкого уровня, где 32-битные цвета хранятся в виде UINT32 или INT, и мне нужна действительно быстрое побитовое преобразование между двумя.
например
int color = -2451337;
//exception
UInt32 cu = (UInt32)color;
есть идеи?
Спасибо и пожелаете
Решение
int color = -2451337;
unchecked {
uint color2 = (uint)color;
// color2 = 4292515959
}
Другие советы
BitConverter.ToUInt32(BitConverter.GetBytes(-2451337), 0)
Те, кто использует язык, такой как VB, который не имеет действительно удобного способа отключения переполнения проверок во время преобразования, может использовать что-то вроде:
Общая функция ACTOSSIGN64 (BYVAL VAL AS UINT64) AS INT64 IF (Val and & H800000000000000000UL) 0, затем возврат CLNG (Val Xor & H8000000000000000000000) XOR & H80000000000000000000 Else return CLNG (VAL) Конечная функция Общая функция Signtouns64 (Byval val as int64) как uint64, если val < 0 Тогда возвращайте CULNG (Val Xor & H800000000000000000) XOR & H8000000000000000UL End Return Culng (Val) End Функция
или
Общая функция unsToSign (ByVal вал Как UInt64) Как Int64 Return CLng (Вэл и & H7FFFFFFFFFFFFFFFUL) + (CLng (- ((Вэл и & H8000000000000000UL) >> 1)) << 1) End Function Shared Function signToUns (ByVal вал Как Int64) Как Uint64 return culng (val and & h7fffffffffffffffffffffffffff) + (culng (- ((val and & h8000000000000000) >> 1)) << 1) Конечная функция
Версии для 32 битов были бы очень похожи. Я не уверен, какой подход будет быстрее. Смещения немного глупы, но они избегают необходимости «если» тестов.
Не связан с StackOverflow