дополнение до 2
От: nikholas Россия  
Дата: 07.04.03 09:03
Оценка:
Предположим, что есть машина с неизвестной кодировкой отрицательных чисел.
Необходимо найти кодировку числа в дополнительной кодировке, т.е. надо реализовать ф-ю(С)
unsigned int get2compliment(int i);
Кто быстрей?
Re: дополнение до 2
От: RS Земля ICQ: 148844272
Дата: 07.04.03 09:13
Оценка:
Здравствуйте, nikholas, Вы писали:

N>Предположим, что есть машина с неизвестной кодировкой отрицательных чисел.


Да нет уж, давай с известной. В неизвестной можно чего угодно намутить (задом наперед числа хранить, ксорить с числом 666 и т.д.)

N>Необходимо найти кодировку числа в дополнительной кодировке, т.е. надо реализовать ф-ю(С)

N>unsigned int get2compliment(int i);
N>Кто быстрей?

Тот, кто знает кодировку.
Re[2]: дополнение до 2
От: nikholas Россия  
Дата: 07.04.03 09:17
Оценка:
Здравствуйте, RS, Вы писали:


RS>Тот, кто знает кодировку.


А как же по поводу переносимости кода? В стандарте "С" про кодтровку ничего не сказано...
ЗЫ Кодировку положительных чисел можно считать известной, никто реальных альтернативных вариантов пока не придумал
Re[3]: дополнение до 2
От: RS Земля ICQ: 148844272
Дата: 07.04.03 09:30
Оценка:
Здравствуйте, nikholas, Вы писали:

N>А как же по поводу переносимости кода? В стандарте "С" про кодтровку ничего не сказано...


Да причем тут стандарты "C", если тебе надо выполнить низкоуровневую операцию (получить дополнительный код числа). Вот если бы просто получить противоположное число, то пожалуйста:
int y = -x;


N>ЗЫ Кодировку положительных чисел можно считать известной, никто реальных альтернативных вариантов пока не придумал


Два альтернативных варианта я уже предложил, могу еще.

З.Ы. По поводу темы сообщения: дополнение до 2 — я так понимаю, что это (2-x)%N или произвольные вариации этого же. Или нет?
Re[3]: дополнение до 2
От: mrhru Россия  
Дата: 07.04.03 09:30
Оценка:
Здравствуйте, nikholas, Вы писали:

N>Здравствуйте, RS, Вы писали:


N>

RS>>Тот, кто знает кодировку.

N>А как же по поводу переносимости кода? В стандарте "С" про кодтровку ничего не сказано...

N>ЗЫ Кодировку положительных чисел можно считать известной, никто реальных альтернативных вариантов пока не придумал

Имхо, навалом.
Младший байт спереду или сзаду.
Хранение в BCD-формате (на каких-нибудь древних машинах).
Хранение в остаточных классах.
Хранение в унарной системе счисления.

Наверняка ещё не всё.
Унылая, пора...
Re[4]: дополнение до 2
От: nikholas Россия  
Дата: 07.04.03 10:06
Оценка:
Здравствуйте, RS, Вы писали:

RS>Да причем тут стандарты "C", если тебе надо выполнить низкоуровневую операцию (получить дополнительный код числа).


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

RS>З.Ы. По поводу темы сообщения: дополнение до 2 — я так понимаю, что это (2-x)%N или произвольные вариации этого же. Или нет?


Дополнение до 2 — это второе название доп. кода ( есть еще дополнение до 1, например, по другому — обратный код)
Re[5]: дополнение до 2
От: RS Земля ICQ: 148844272
Дата: 07.04.03 10:12
Оценка:
Здравствуйте, nikholas, Вы писали:

N>В некоторых протоколах требуется, чтобы числа были в доп. формате, а их представление на целевой машине неизвестно. Отсюда вытекает потребность в подобном преобразовании на языке более высокого уровня.


Это значит, что операции над числами в доп. коде тебе придется:
1) реализовывать аппаратно, надеясь, что целевая машина все-таки работает в доп. коде.
2) реализовывать самому — побитовое сложение, умножение...
3) сделать несколько вариантов исходников (пользуясь #define) для различных аппаратных платформ.

Настоятельно рекомендую третий вариант.

N>Дополнение до 2 — это второе название доп. кода ( есть еще дополнение до 1, например, по другому — обратный код)


Спорить не стану, не помню я. Но дополнительный код, обратный код как-то проще звучат.
Re[6]: дополнение до 2
От: nikholas Россия  
Дата: 07.04.03 10:16
Оценка:
Здравствуйте, RS, Вы писали:

RS>Здравствуйте, nikholas, Вы писали:


N>>В некоторых протоколах требуется, чтобы числа были в доп. формате, а их представление на целевой машине неизвестно. Отсюда вытекает потребность в подобном преобразовании на языке более высокого уровня.


RS>Это значит, что операции над числами в доп. коде тебе придется:

RS>1) реализовывать аппаратно, надеясь, что целевая машина все-таки работает в доп. коде.
RS>2) реализовывать самому — побитовое сложение, умножение...
RS>3) сделать несколько вариантов исходников (пользуясь #define) для различных аппаратных платформ.

RS>Настоятельно рекомендую третий вариант.


Никаких операций над такими числами не требуется — надо его получить и полать куда-нибудь

ЗЫ Я послал это в "этюды" не по своей тупости а потому, что решение красиво и изящно, на мой взгляд
Re[4]: дополнение до 2
От: nikholas Россия  
Дата: 07.04.03 10:22
Оценка:
Здравствуйте, mrhru, Вы писали:

M>Имхо, навалом.

M>Младший байт спереду или сзаду.

Можно еще поинтересоваться порядком битов в байте
На представление числа это не влияет — все равно все операции с числами работают правильно

M>Хранение в BCD-формате (на каких-нибудь древних машинах).

M>Хранение в остаточных классах.
M>Хранение в унарной системе счисления.

M>Наверняка ещё не всё.


Ну я же говорил про разумные варианты...
Где же вы видели реализацию инта в С такими "изысканными" способами?
Re[7]: дополнение до 2
От: RS Земля ICQ: 148844272
Дата: 07.04.03 10:25
Оценка:
Здравствуйте, nikholas, Вы писали:

N>Никаких операций над такими числами не требуется — надо его получить и полать куда-нибудь


Так что ж ты тень на плетень наводишь?


Получай и посылай. И фиг бы с ним, в какой оно кодировке.
Re[5]: дополнение до 2
От: mrhru Россия  
Дата: 07.04.03 10:35
Оценка:
Здравствуйте, nikholas, Вы писали:


M>>Хранение в BCD-формате (на каких-нибудь древних машинах).


На древних машинах...

M>>Хранение в остаточных классах.

На спецмашинах. Помница, в СССР, году в 70-м, сделали ЭВМ для радиолокаторов в остаточных классах.
Быстродействие порядка 1 млрд. оп/сек.

M>>Хранение в унарной системе счисления.


Бухгалтерские счёты. Правда не знаю, язык С для них реализован или нет.

M>>Наверняка ещё не всё.


N>Ну я же говорил про разумные варианты...

N>Где же вы видели реализацию инта в С такими "изысканными" способами?

Гм, извиняюсь. Настроение весеннее , а упоминание про разумные варианты — не встретил.
Унылая, пора...
Re: дополнение до 2
От: m.a.g. Мальта http://dottedmag.net/
Дата: 08.04.03 08:34
Оценка: 6 (1)
Здравствуйте, nikholas, Вы писали:

N>Предположим, что есть машина с неизвестной кодировкой отрицательных чисел.

N>Необходимо найти кодировку числа в дополнительной кодировке, т.е. надо реализовать ф-ю(С)
N>unsigned int get2compliment(int i);
N>Кто быстрей?

То ли я туплю, то ли так:

return i > 0 ? i : (~-i) + 1;
Re[2]: дополнение до 2
От: nikholas Россия  
Дата: 08.04.03 12:19
Оценка:
Здравствуйте, m.a.g., Вы писали:


MAG>
MAG>return i > 0 ? i : (~-i) + 1;
MAG>


Уже тепло, но для INT_MIN это не будет верным (если вдруг число уже в доп. кодировке, то INT_MIN = -INT_MAX — 1)
Re[3]: дополнение до 2
От: m.a.g. Мальта http://dottedmag.net/
Дата: 09.04.03 13:57
Оценка:
Здравствуйте, nikholas, Вы писали:

MAG>
MAG>return i > 0 ? i : (~-i) + 1;
MAG>


N>Уже тепло, но для INT_MIN это не будет верным (если вдруг число уже в доп. кодировке, то INT_MIN = -INT_MAX — 1)


Тогда

return i == INT_MIN ? ~0 : i > 0 ? i : (~-1) + 1;


Re[4]: дополнение до 2
От: nikholas Россия  
Дата: 10.04.03 10:44
Оценка:
Здравствуйте, m.a.g., Вы писали:

MAG>Здравствуйте, nikholas, Вы писали:


MAG>
MAG>return i > 0 ? i : (~-i) + 1;
MAG>


N>Уже тепло, но для INT_MIN это не будет верным (если вдруг число уже в доп. кодировке, то INT_MIN = -INT_MAX — 1)


MAG>Тогда


MAG>
MAG>return i == INT_MIN ? ~0 : i > 0 ? i : (~-1) + 1;
MAG>


MAG>



На самом деле это тоже не верно, т.к. значение INT_MIN зависит от кодировки числа (в обратном коде это -127, а не -128)

На мой взгляд наиболее правильным будет

return i > 0 ? i : ~(-(i+1));


На мой взгляд очень изящная задачка, жаль, что она никому особо не приглянулась
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.