Еще чуть-чуть поэкспериментировал
В случае not(not boolean(n)) происходит просто вычисление boolean(n) и сравнение результата с нулем - результат ожидаемый.
В случае not boolean(n) происходит побитовая инвертация и сравнение с нулем. Т.е. в случае 2, сначала инвертация, потом сравнение с 0, что даст true в итоге. Неправильно конечно же. Но видимо предполагалось, что boolean будет принимать в качестве параметра только 0 или 1. По правильному boolean должна возвращать только 2 значения: 0(false) или 1(true).
Похоже даже не инвертация первого бита, потому как первый бит = 1 у нечетных чисел (3,5,7,...). Инвертация 1 не будет нулем. Т.е. not boolean(1) возвращает то что нужно, хотя инвертация byte(1) даст 254. А вот not boolean(2,3,...) уже лажает. Т.е. тут по особому 1 обрабатывается. Результат будет верный, только если boolean принимает 1 или 0.
да нет, все одинаково обрабатывается. под первым битом я имел ввиду наименее значащий, т.е. в такой записи он последний:
"not" 00000000 = 00000001 -> true
"not" 00000001 = 00000000 -> false
"not" 00000010 = 00000011 -> true
"not" 00000011 = 00000010 -> true
"not" 00000100 = 00000101 -> true
...
например, integer(not boolean(253)) -> 252, т.к. "not" 11111101 дает 11111100.
Последний раз редактировалось ahv 20 авг 2010, 12:47, всего редактировалось 1 раз.
немного повторюсь для полноты.
здесь "not" = not boolean(...), конечно.
not boolean(1) возвращает что нужно именно потому, что "not" 1 дает 0.
not byte(1) в галактике кстати возвращает -2, а вот byte(not 1) = 254.