Перенос знака в .NET

Тип с плавающей запятой в Java описан в JLS: 4.2.3 Типы, форматы и значения с плавающей запятой .

Он говорит об этих специальных значениях:

(...) Каждое из четырех наборов значений включает в себя не только конечные ненулевые значения, которые приписываются ему выше, но также значения NaN и четыре значения положительный ноль, отрицательный нуль, положительная бесконечность , и отрицательная бесконечность. (...)

blockquote>

И имеет некоторые важные заметки о них:

Положительный нуль и отрицательный нуль сравниваются равными; таким образом, результат выражения 0.0 == - 0.0 является истинным, а результат 0.0> -0.0 является ложным. Но другие операции могут различать положительный и отрицательный ноль; например, 1.0 / 0.0 имеет значение положительной бесконечности, а значение 1.0 / -0.0 - отрицательная бесконечность.

blockquote>

Вы не можете «отменить» эту функцию, это часть того, как float work.

Подробнее о отрицательном нуле смотрите в записи Signed zero Wikipedia.

Если вы хотите проверить, какой «вид» но у вас есть, вы можете использовать тот факт, что:

(new Float(0.0)).equals(new Float(-0.0))

- false (но действительно, 0.0 == -0.0).

Посмотрите здесь больше: Интенсивности чисел с плавающей запятой Java .

13
задан Syed Tayyab Ali 30 September 2009 в 17:51
поделиться

5 ответов

В C # сдвиги - это арифметические сдвиги (в отличие от логических сдвигов). При арифметическом сдвиге вправо знаковый бит сдвигается влево, поэтому знак числа сохраняется. Сдвиг вправо эквивалентен делению на 2:

alt text

Если требуется логический сдвиг (без расширения знака), используйте числа без знака :

alt text

31
ответ дан 1 December 2019 в 18:13
поделиться

http://msdn.microsoft.com/en-us/library/k2ay192e.aspx

"The >> operator shifts the bits of expression1 right by the number of bits specified in expression2. The sign bit of expression1 is used to fill the digits from the left. Digits shifted off to the right are discarded. The data type of expression1 determines the data type returned by this operator."

5
ответ дан 1 December 2019 в 18:13
поделиться

per http://www.blackwasp.co.uk/CSharpShiftOperators.aspx

...signed integers use the highest order bit to determine if the value of a variable is positive or negative and that the remaining bits use two's complement notation for negative values The highest order bit would normally be considered as the overflow bit for a shift left operation. To allow for this, C# understands that this bit should not be adjusted for signed data types and that negative numbers should be shifted accordingly. Thus shifting works for negative values as well as positive ones.

int value = -240;
int halved = value >> 1;      // Result = -120
2
ответ дан 1 December 2019 в 18:13
поделиться

Сдвиг вправо целых чисел со знаком в C # заполняет левые биты знаковым битом . Фактически, результат сдвига вправо целого числа со знаком на один бит эквивалентен делению его на 2.

Вы можете найти такой сдвиг вправо и в других местах. Например, сборка x86 предоставляет две отдельные инструкции, sar (которая заполняет левые биты знаковым битом) и shr (заполняет левые биты нулями).

Если вы этого не сделаете. Мне не нужно такое поведение в C #, вам придется использовать беззнаковые типы при сдвиге.

3
ответ дан 1 December 2019 в 18:13
поделиться

Короткий ответ на ваш вопрос, как вы выяснили, - использовать целое число без знака, чтобы не вводить знаковый бит, и все в порядке. Однако примите во внимание следующий

совет по оптимизации

. Предполагая, что вам нужно сделать много таких преобразований (обычно в растровом изображении много пикселей), вам следует подумать об использовании массива из 256 байтов, который предоставит напрямую обратная версия битового шаблона (или любое другое преобразование) для одного полного байта. Затем, напрямую проиндексируя этот массив, со старшим или младшим байтовым значением 16-битного слова, вы получите результаты для всех 8 бит. В некоторых случаях, когда время / производительность слишком высоки (и пространство доступно ...), вы даже можете использовать массив размером 64 КБ, обрабатывая по одному полному слову за раз.

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

    byte[] mirror = { 
       0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
       0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
       0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x78, 0xF8,
       // etc..
       0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
    };
1
ответ дан 1 December 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: