cHeRsAnYa1, неграмотно там, кстати, написано. Приложения действительно пишутся на Java, но это не Java-приложения. И приложения там целиком на C не напишешь, все равно определенная часть будет на Java.
Когда я делаю первый бит равным нулю(делаю число положительным) таким способом "i & 0x7fffffff", то меняется не только знак, но и число. не пойму почему число меняется при смене первого бита?
DDDEN!SSS, запусти такой пример: System.out.println(Integer.toBinaryString(-20)); System.out.println(Integer.toBinaryString(20)); Явно не одним старшим битом отличаются.
KiFFiR, это ясно. Но почему? Везде пишут, что один бит отвечает за знак, значит при его изменении должнен меняться только знак. мне щас негда запустить.
DDDEN!SSS, по последнему биту действительно можно определить знак, но это не означает, что остальные биты у положительных и отрицательных чисел совершенно идентичны. Чтобы понять, почему так происходит, надо знать, как располагается диапазон значений. Представь, что мы к 0 прибавляем единицы. От 00000000 (0) до 01111111 (127) никаких чудес не будет. Затем, если прибавить еще единицу, получится число 10000000, соответствующее -128. Затем, если и дальше прибавлять единицу, то мы постепенно придем к 11111111, что соответствует -1. Если прибавить единицу еще раз, получится 0. Если бы был сделан знак отдельно, то при прибавлении к отрицательному числу единицы число бы не увеличивалось, а уменьшалось, что неудобно, и еще существовал бы -0. А еще такое хранение позволяет без особых проблем хранить беззнаковые числа в переменных со знаком.
А как происходит смена знака i=-i ? Что там происходит кроме замены первого бита? А можно где-то почитать про способы оптимизации с помощью побитовых операций?
DDDEN!SSS, нет, смысл в том, что беззнаковые и знаковые переменные - это одни и те же числа, просто интрепретируются по-разному. Допустим, что будет, если записать 129 в знаковую переменную? Да ничего, просто она по умолчанию напечатается в строку как -127. Если прибавить единицу, работая как с числом со знаком, а потом прочитать как беззнаковое, получится 130, как и предполагалось. Работа с числами со знаком ничем от беззнаковых не отличается. А если записать 129 по той схеме, запишется как -1 (10000001). Если с ним начать работать как с числом со знаком, то при прибавлении единицы получится -0, и в беззнаковом представлении это будет число 128 (10000000). Так с числами сложнее работать. На самом деле, твой метод, например, применяется в числах с плавающей запятой. Там последний бит - знак, а остальные поделены между значащей частью и экспонентой. Но с этими числами и операции значительно сложнее. Кстати, для смены знака нужно инвертировать биты и прибавить единицу.
31 июл 2010 в 08:14