задачки про биты (для программистов)
Jan. 12th, 2008 03:49 am1. Что делает функция g(x)? Зачем она нужна? x - положительное целое число.
2. 64-битное число содержит восемь ASCII-символов, по одному в каждом байте. Дано, что каждый из этих символов либо пробел, либо цифра, либо латинская буква. Произведите над всеми символами операцию toupper() (переводящую строчные буквы в прописные) с помощью всего трех битовых операций над исходным числом. Битовой операцией, определенности ради, назовем одно из двух: a) любую операцию с одним или двумя аргументами, значение которой в каждом бите результата зависит только от соответствующих битов аргументов; b) сдвиг влево или вправо.
(update: первоначально я забыл разрешить b) выше, виноват)
f(x) = x & -x h(x) = x + f(x) g(x) = (((h(x) xor x)/f(x)) >> 2) + h(x)
2. 64-битное число содержит восемь ASCII-символов, по одному в каждом байте. Дано, что каждый из этих символов либо пробел, либо цифра, либо латинская буква. Произведите над всеми символами операцию toupper() (переводящую строчные буквы в прописные) с помощью всего трех битовых операций над исходным числом. Битовой операцией, определенности ради, назовем одно из двух: a) любую операцию с одним или двумя аргументами, значение которой в каждом бите результата зависит только от соответствующих битов аргументов; b) сдвиг влево или вправо.
(update: первоначально я забыл разрешить b) выше, виноват)
no subject
Date: 2008-01-12 01:08 pm (UTC)f(x) = 1000
h(x) = f(x) + x = 1011000000 (у вас 1011110000, результат сложения с 111000, а не с 1000)
h(x) ^ x = 0001111000, у вас получилось так же, хотя должно было получиться 1011110000 ^ 1010111000 = 0001001000. Как это так вышло? :)
Отсюда значение g(x) должно выйти выходит неверным, если вы не подставили в конце опять правильное h(x) вместо своего неправильного :) (и да, у нее есть более полезное применение).
no subject
Date: 2008-01-12 02:03 pm (UTC)no subject
Date: 2008-01-12 02:03 pm (UTC)