задачки про биты (для программистов)
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 02:19 am (UTC)2. Пока только 4 получается.
no subject
Date: 2008-01-12 02:35 am (UTC)no subject
Date: 2008-01-12 03:01 am (UTC)map { print chr($_ & ~($_ & 0100) >> 1); } (32, 48..57, 65..90, 97..123);
no subject
Date: 2008-01-12 03:14 am (UTC)А что такое A057168?
no subject
Date: 2008-01-12 03:16 am (UTC)Это чтобы avva знал, что я догадался, а остальные могли подумать.
no subject
Date: 2008-01-12 03:48 am (UTC)no subject
Date: 2008-01-12 03:39 am (UTC)no subject
Date: 2008-01-12 03:50 am (UTC)no subject
Date: 2008-01-12 04:23 am (UTC)no subject
Date: 2008-01-12 04:25 am (UTC)no subject
Date: 2008-01-12 04:43 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2008-01-12 10:23 am (UTC)no subject
Date: 2008-01-12 08:28 am (UTC)Все-таки три: вместо энд и инверсии используем функцию, которая является их комбинацией.
no subject
Date: 2008-01-12 08:31 am (UTC)no subject
Date: 2008-01-12 03:31 pm (UTC)no subject
Date: 2008-01-13 02:14 pm (UTC)no subject
Date: 2008-01-12 10:22 am (UTC)no subject
Date: 2008-01-12 03:13 am (UTC)no subject
Date: 2008-01-12 10:20 am (UTC)no subject
Date: 2008-01-12 02:12 pm (UTC)no subject
Date: 2008-01-12 02:20 pm (UTC)no subject
Date: 2008-01-12 03:46 am (UTC)no subject
Date: 2008-01-12 10:20 am (UTC)no subject
Date: 2008-01-12 01:48 pm (UTC)no subject
Date: 2008-01-12 08:17 am (UTC)2. если бы не цифры, хватило бы одной. Будем думать, что делать с цифрами (видимо, надо придумать такой f и f^-1, чтобы посредине можно было сделать or с соотв. маской).
no subject
Date: 2008-01-12 09:51 am (UTC)f == "самый младший ненулевой разряд", вообще-то.
no subject
Date: 2008-01-12 10:20 am (UTC)no subject
Date: 2008-01-12 11:23 am (UTC)2. за две операции:
(((X xor A) and B) xor A)
где А - учетверенный пробел, В -его обращение.
no subject
Date: 2008-01-12 11:50 am (UTC)2. нет, это что-то не то
no subject
Date: 2008-01-12 01:41 pm (UTC)2.да, у меня странная была идея что это можно сделать без сдвигов, какой-то бред написал.
можно :
С = 01000000010000000100000001000000
F(X): X & C
G(X) : ~(X >>1)
H(X) : X & F(G(X))
no subject
Date: 2008-01-12 01:31 pm (UTC)no subject
Date: 2008-01-12 11:35 am (UTC)no subject
Date: 2008-01-12 11:49 am (UTC)no subject
Date: 2008-01-12 01:38 pm (UTC)no subject
Date: 2008-01-12 07:21 pm (UTC)no subject
Date: 2008-01-12 11:54 am (UTC)А я уже решил, что совсем квалификацию потерял. С этим пунктом в 3 "операции" всё укладывается, конечно же.
no subject
Date: 2008-01-12 12:38 pm (UTC)no subject
Date: 2008-01-12 12:41 pm (UTC)И непонятно, зачем нужна такая g(x).,
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)no subject
Date: 2008-01-12 01:46 pm (UTC)1ая задача
Date: 2008-01-12 05:49 pm (UTC)g(XXXXXXXX1<--k нулей-->) = 1<--k нулей-->
h(x) - зануляет младшую непрерывную последовательность единиц (начиная с k-ого разряда) в бинарном представлении и выставляет 1 в первый промежуток за последовательностью единиц.
h(XXXX0<--m единиц--><--k нулей-->) = XXXX1<--(k+m) нулей-->
z(x)=(((h(x) xor x)/f(x)) >> 2) - последовательность единиц за k-ым разрядом, спущенная до начала слова
z(XXXX0<--m единиц--><--k нулей-->) = <--(m-1) единиц-->
g(XXXX0<--m единиц--><--k нулей-->) = XXXX1<--(k+1) нулей--><--(m-1) единиц-->
g(x) сохраняет количество 1 и 0 :)
Re: 1ая задача
Date: 2008-01-12 06:18 pm (UTC)Re: 1ая задача
Date: 2008-01-13 12:10 pm (UTC)блин сто лет не брал в руки шашек. и зачем сейчас вот по
Date: 2008-03-16 01:42 pm (UTC)x:= x and not ((x shr 1) and c);
не знаю я как AND NOT записать в 1 функцию
я помню как надо мной смеялись когда я такую фигню с флагами в WINAPI проделывал, но ведь работало!
А если есть какой безумный способ преобразовать все к 3м операциям через эквивалентные преобразования то я этим извращением сейчас заниматься не буду :)
upd fix
Date: 2008-03-16 01:47 pm (UTC)