|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 31, 2003 02:23:48 · Поправил: The Svin стр. 30. таблица 2.1. Седьмая колонка X & (not X) Должно быть Y & (not X) |
|
|
Дата: Дек 25, 2003 20:17:33 Что то в этой книге ничего полезного не нашел!!! В чем прикол этой книги подскажите пожалуйста, где ее можно применить в оптимизации? Я уже не говорю что она написана под 64 битную архитектуру регистров... |
|
|
Дата: Июн 13, 2004 22:40:32 emergenter 1. Очевидно, что книгу ты не читал, или читал так невнимательно, что можно приравнять с первым утверждением. В начале книги указано что если не оговаривается размер операнда то подразумевается, что он 32 бита. Ты же заявляешь о 64 архитектуре. Возможно, ты имел ввиду что автор вначале говорит о RISC процессорах. Но тогда твоя ошибка ещё более грубая - ты отождествляешь разрядность и архитектуру. О применимости можно сказать следующее - большинство мыслей там не платформенно-зависимые. Они зависят лишь применяется ли дополнительный код в операциях, и применима ли базовая логика. В любых платформах: (дополнительный код) & (базовая логика)-> книга применима. 2. Если ничего полезного ты не нашёл, очевидно, что либо описанное в книге ты и так знаешь, либо задачи, для решения которых описанны приведённые приёмы тебе решать не приходилось. Т.е. задачи для которых может понадобится быстрый и сложный анализ\управление бит. У меня такие задачи встречаются, даже в самых пустяковых исходниках. Можешь посмотреть в них если нужны примеры. анти офтопик стр. 26. Для того, чтобы установить крайний справа нулевой бит (например, 10100111->10101111, если исходное слово равно 0, возвращает слово, состоящее из одних единиц), используется следующая формула: x | (x + 1) Коментарий - неверна выделенная часть. При нуле вернётся не слово из одних единиц а единица т.е. слово вида 00...01 |
|
|
Дата: Июн 24, 2004 18:09:52 "Для всех приведённых выше формул выполняется принцип дуализма: если в описании формул единицы заменить нулями (и нули единицами), а в самих формулах заменить x-1 на x+1 и обратно, -x на not(x+1), & на | и | на &, оставив без изменений только x и not x, то в результате получим правильные выражения и описания" Слово выделенное здесь только переводчик добавил от себя и это исказило смысл. В оригинале просто Leave x and (not x) alone. Теперь почему смысл исказился. Дело в том, что среди упомянутых формул используется также: x xor (x-1). Которая ставит завершающие нули и следующий за ними правый единичный бит в единицы а остальные биты сбрасывает. Однако сама операция xor в перечислении замен для получения дуальной формулы ни в переводе ни в оригинале не упоминается. Возникает вопрос "а как же с xor для получения дуальной формулы, нужно её заменять или оставить как есть?" Про not тоже заметим - ничего не сказано, только про not x. Вопрос а как же с not (x | -x)? В оригинале слово "только" не стоит, поэтому можно предположить (и это правильно) что про то что не сказано менять - не менять. Здесь же мы можем предположить что xor нужно менять, но предположив это мы сталкиваемя с проблемой - на что менять xor? Прямого указания нет. Поэтому опять же мы можем предположить что разбить нужно на базовые операции, причём такие чтобы можно было осуществить замену. Если использовать только такие операции то x xor (x - 1) можно представить как: ((not x) and (x -1)) + (x and (not(x-1)) теперь если мы заменим по указанным правилам операции то получим ((not x) or (x + 1)) + (x or (not(x+1)) Кстати здесь мы тоже сталкиваемся с проблемой: а как же +? Его тоже нужно менять? Но видно что формула не будет являтся дуальной ни в каком случае хоть с + хоть с -. Эта формула будет ставить lsb в 0 а остальные биты в 1. На самом деле xor не нужно ни расскладывать ни вообще менять. к формуле x xor (x - 1) дуальной будет формула x xor (x + 1) В то время как x xor (x - 1) ставит в 1 завершающие нули и близжайшую к ним единицу в 1 а остальные биты сбрасывает, формула x xor (x + 1) будет ставить завершающие единицы и близжайший к ним ноль в 1 а остальные биты сбрасывать. например x xor (x - 1) отображает 00100 -> 00111 а x xor (x + 1) отображает 00011 -> 00111 Т.е. нужно поменять (x - 1) на (x + 1) и больше ничего не трогать. Вот какие беды может принести неправильное слово "только" человеку с богатым воображением :) |
|
|
Дата: Июл 25, 2004 12:29:14 стр. 37 "Команды сравнения и бит переноса" цитата: Запись carry(выражение), означает, что флаг переноса генерируется при выполнении команды выражение... x = y: carry(0 - (x - y)), или carry((x+y)+1), или carry((x-y)-1) Замечания: Первая претензия касается перевода. Сразу же бросается в глаза странность во фразе ...при выполнении команды выражение. Что такое "команда выражение"? Мы ведь видим далее в тексте выражения содержащие по несколько команд. Смотрим английский вариант: The notation carry(expression) means the carry bit generated by the outermost operation in expression Сразу становится понятно, что переводчик не понял Уоррена. Имеется ввиду что CF устанавливается последней (крайней) командой в выражении. Причём логически важно понимать, что "последняя" это не в записи последняя, а последняя команда которая будет выполнятся по правилам выполнения действий в выражении. Например в выражении 0-(x-y) последним вычислением будет вычитание из 0 а не x-y. Кто читал Уоррена понимает, что тот ну жутко просто немногословен (он умудрился запихнуть в тонкую книжку столько информации, сколько Кнут бы расположил в толстенном томе, хотя и Кнута тоже "болтуном" не назовёш), и если уж он что говорит, то это важно. Уоррен настойчиво привлекает внимание к порядку операций, и что они должны быть выполнены строго так как записаны в выражении только в этом случае гарантируется правильность. Раскройте скобки, примените комутативность или ассоциативность создавая из данных выражений новые преобразованные и вычисления по таким выражениям могут быть ошибочными (не привести к связям с установкой CF заявленных условий сравнения) Поэтому он ставит скобки даже в таком случае как ((x+y)+1) чтобы подчеркнуть важность порядка действий, хотя здесь и по правилам действий выражения и по расположению в записи действия написаны как их надо выполнять. Теперь перейдём к ошибкам (или опечаткам?) самого Уоррена. При внимательном рассмотрении выражений видим, что первое и последнее: x = y: carry(0 - (x - y)), или ... carry((x-y)-1) по разному действуют на CF в зависимости от выполнения условия x = y. (0 - (x - y)) не устанавливает CF если x = y (и устанавливает в противном) carry((x-y)-1) как раз устанавливает CF при x = y Обычно во всех случаях приводимые Уорреном выражения приводят к одинаковому заявленому результату помимо вообще того что, они связаны с заявлеными условиями (в данном случае CF зависит от равенства). В данном случае мы видим что установка выражением CF действительно связана с равенством x и y, но действует на CF с точностью до наоборот. И наконец выражение ((x+y)+1) Это выражение никакой однозначной связи установки CF в зависимости от x=y не имеет. При анализе выражения становится понятно, что пропущено NOT перед y. Т.е. должно быть ((x+not(y))+1) Обратим внимание на последнее действие "+1". Мы можем однозначно сказать что такое действие приведёт к переносу тогда и только тогда когда во втором слогаемом все биты установлены в 1. После этого становится ясно, что алгоритм заложенный в выражении построен на известной тавтологи X or not X. Действительно если x и y равны, то и биты их равны. Значит 1. Сложение с инверсиями на каждой битовой позиции не вызовет переноса (x + x'= 1 + 0 или 0 + 1) 2. Все биты будут гарантировано установлены в 1 (число=-1 если рассматривать как знаковое). Таким образом нужно изменить ((x+y)+1) на ((x+not(y))+1) |
|
|
Дата: Июл 28, 2004 15:25:12 Надо сказать, что неоднозначность должен ли CF устанавливаться при соблюдении условий, или наоборот сбрасываться присутсвует во всей статье про установку CF в зависимости от соблюдения условий. При этом автор не делает никаких пометок или пояснений будет ли CF по этой формуле ставится при соблюдении условий или наоборот сбрасываться. Например: условие x=y и приводимая для него формула ((x-y)-1) при анализе формулы видно, что CF будет ставится при выполнении условия. Другое условие и формула беззнаковый x <= y и формула для него y-x. При действии этой формулы CF уже будет ставится когда условие не выполняется. Наиболее наглядный пример такой неоднозначности это условие где для проверки и установки CF приводятся две разные формулы в одной строке (стр. 38) x=0: 0-x или not(x)+1 При выполнении условия первая сбросит а вторая из них установит CF. Вообще такое ощущении что Уоррен собрал эти формулы из разных источников не проанализировав и не сгруппировав толком. Косвенное поддтверждение (помимо неоднозначности - должен CF устанавливаться или наоборот сбрасываться по условию) это то что в некоторых формулах использован нетипичный для книги синтаксис, отличный от остальных мест в книге. |
|
|
Дата: Июл 29, 2004 23:09:21 У меня "исправленное издание". Стр. 40: Для этого можно воспользоваться приведенными ниже формулами (в которых нет команд ветвления и которые заведомо не генерируют переполнения). x+y+c z <- (x eq y) and 0x80000000 ((x+y+c) xor x) and ((x xor z)+y+c) eq y Так вот что-то я никак не пойму как x+y+c не вызывает переполнения? Недавно купил книгу, до сих пор разбираюсь. Не поможете? |
|
|
Дата: Июл 30, 2004 22:02:58 Можно если я сам знаю ответ :), только в этом топике лучше ошибки обсуждать. Можно топик типа "Вопросы к Hackers Delight". Кстати, ошибки если только специально не сказано присутсвуют в английском оригинале тоже. Интересно английское издание тоже исправляли или это инициатива редакторов исправить русское? |
|
|
Дата: Июл 30, 2004 22:26:56 Ага посмотрел, можно здесь говорить - так как там вообще неверные формулы. Должно быть так: для x+y+c проверяем как z<-(x eq y)& 2^31 (x eq y)&((x xor z)+y+c)eq y а для x - y - c формула там правильная. Издателям пора нам дать на пиво, или по крайней мере на чай как думаешь :) |
|
|
Дата: Июл 31, 2004 05:02:56 Дополнение к ошибке в описании X | (X + 1) В оригинале на простом английском сказано Use the following formula to turn on the rightmost 0-bit in a word, producing all 1's if none Т.е. мол нет нулей в числе (иначе одни единицы) - то и вернутся одни единицы. В переводе почему то это поняли как если x = 0, то возвращается слово из одних единиц :) |
|
|
Дата: Авг 4, 2004 01:37:17 Кстати даже само правильное выражение (x eq y)&((x xor z)+y+c)eq y не очень удачано записано Уорреном. Последнее eq y должно быть сделано перед конъюнкцией. Иначен при любом (например) положительном y переполнения не зафиксируется при сложении положительных. Т.е. лучше было записать его как (x eq y)& (((x xor z)+y+c)eq y) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.109 |