Самый быстрый способ представлять int32 побитовые?

StackOverflow https://stackoverflow.com/questions/3600871

  •  25-09-2019
  •  | 
  •  

Вопрос

У меня есть некоторые операции изображения / текстуры низкого уровня, где 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 битов были бы очень похожи. Я не уверен, какой подход будет быстрее. Смещения немного глупы, но они избегают необходимости «если» тестов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top