Вопрос

У меня есть процедура быстрого уровня битов, которая вычисляет значение и возвращает UINT32. Мне нужно сохранить это значение в SQL Server в 32 -битном поле Int. Я не хочу увеличивать размер поля и просто хочу хранить «байты» из этой функции поля Int.

Сотни этих записей запрашиваются за раз, поэтому мне нужен самый быстрый способ преобразования UINT32 в INT в цикле. Если в левой части бит установлен в UINT32, он должен установить знак int (или сделать что-то «повторяемое», на самом деле, но бит знака, вероятно, будет проще).

Другими словами, я просто хочу, чтобы 4 байта UINT32 стали 4 байтами 32 -битного Int. Я мог бы использовать класс BitConverter, но я не уверен, что это самый быстрый способ. Было бы быстрее сделать это с такой неконтролированной областью, как это:

UInt32 fld = 4292515959;
unchecked {
    return (int)fld;
    // -2451337
}

Я вижу, что обратный вопрос был задан здесь, и мне было просто интересно, будет ли ответ таким же, идущий в другую сторону:

Самый быстрый способ поднять Int к Uint32 Bitwise?

Это было полезно?

Решение

Я бы сказал, что неконтролированная версия (например unchecked((int)x)) это самый быстрый способ, так как нет метода вызова. Я не верю, что есть быстрее.

Кстати, UInt32 это просто другое имя для uint... идти в одну сторону - это то же самое, что и другой путь с точки зрения производительности, так что это действительно то же самое, что и ссылка, которую вы разместили.


РЕДАКТИРОВАТЬ: Я помню, как смотрел из первых рук экземпляр теста, где checked был Быстрее чем unchecked (И нет, это была не отладочная сборка, это была сборка релиза с оптимизацией). Я не знаю, почему это произошло, но в любом случае, не думайте, что вы получите что -то измеримое, поворачиваясь на проверке переполнения.

Другие советы

unchecked((int)x) требуется только константы литья и проверенные и неконтролируемые дает те же результаты (если код может компилироваться).

Например, этот код

uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
    uncheckedData = (int)data;
}
checkedData = (int)data;

Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);

производит этот выход

4292515959
-2451337
-2451337

Чтобы быть более кратким, этот код может быть составлен (тот же результат, что и unchecked((int)data))

uint data = 4292515959;
checkedData = (int)data;

Этот код (обратите внимание на констант) не может быть скомпилирован (требует неконтролируемого)

const uint data = 4292515959;
checkedData = (int)data;

Этот код также не может быть составлен (требует неконтролируемого)

checkedData = (int)4292515959;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top