2011-01-02 2 views
1

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

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

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

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

я вижу обратный вопрос был здесь Спрашивается, а просто интересно, если ответ будет такой же идти другим путем:

Fastest way to cast int to UInt32 bitwise?

+0

Это то же самое, вы можете думать о C# как C с проверками безопасности. Поэтому, если вы хотите, чтобы typecast без знака int int, просто используйте литье типов. Но сначала приложите его к неконтролируемому сигналу, чтобы компилятор не проверял ваше намерение, но это не привело бы к тому, что компилятор поднимет вам ошибку, что присвоение несовместимо, несовместимо, это означает, что точность перевода может быть потеряна при переводе (например, 4292515959 не то же самое, становятся отрицательными 2451337 (они одинаковы в перспективе компьютерного ученого [xkcd 541])) –

+0

Спасибо, Майкл. Если бы вы не сделали этого комментария, я бы сразу проголосовал за это в качестве ответа. – Flipster

ответ

3

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

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


Edit: Я помню, наблюдая из первых рук экземпляр эталона, где checked был быстрее, чемunchecked (и нет, это не было отладки сборки, это был релиз строить с оптимизацией). Я не знаю, почему это произошло, но в любом случае не думайте, что вы получите что-нибудь измеримое, повернув проверку переполнения.

+0

Спасибо, Ламберт. Просто уверенность, в которой я нуждался. – Flipster

Смежные вопросы