Тип с плавающей запятой в 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 .
В C # сдвиги - это арифметические сдвиги (в отличие от логических сдвигов). При арифметическом сдвиге вправо знаковый бит сдвигается влево, поэтому знак числа сохраняется. Сдвиг вправо эквивалентен делению на 2:
Если требуется логический сдвиг (без расширения знака), используйте числа без знака :
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."
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
Сдвиг вправо целых чисел со знаком в C # заполняет левые биты знаковым битом . Фактически, результат сдвига вправо целого числа со знаком на один бит эквивалентен делению его на 2.
Вы можете найти такой сдвиг вправо и в других местах. Например, сборка x86 предоставляет две отдельные инструкции, sar
(которая заполняет левые биты знаковым битом) и shr
(заполняет левые биты нулями).
Если вы этого не сделаете. Мне не нужно такое поведение в C #, вам придется использовать беззнаковые типы при сдвиге.
Короткий ответ на ваш вопрос, как вы выяснили, - использовать целое число без знака, чтобы не вводить знаковый бит, и все в порядке. Однако примите во внимание следующий
совет по оптимизации
. Предполагая, что вам нужно сделать много таких преобразований (обычно в растровом изображении много пикселей), вам следует подумать об использовании массива из 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
};