- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
int Xor4Bit_2 (unsigned char data)
{
unsigned char result = data;
while (data != 0)
{
result ^= data & 1;
data >>= 1;
}
result &= 1;
return result;
}
вот как студенты получают xor битов числа
это же нужно так извратить простой рабочий алгоритм
int Xor4Bit_2 (unsigned char data)
{
int result = 0
while (data != 0)
{
result ^= data & 1;
data >>= 1;
}
return result;
}
получил данный код после измышлизмов знакомого студента, перед этим дав ему рабочий вариант, мдя...
Dummy00001 04.07.2010 23:55 # +2
по мне так оба гавно. итерацию по битам можно сделать лучше. а для uint8_t можно и вообще без циклов.
http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/
Stalker 05.07.2010 00:46 # +1
TarasB 05.07.2010 18:27 # 0
Это что?
absolut 05.07.2010 20:16 # 0
А вообще - остаток от деления.
TarasB 05.07.2010 20:38 # +1
Говногость 05.07.2010 22:31 # +2
>Это что?
Не подъёмный матан для любителей писать прозрачные легко поддерживаемые обновляемые почти безошибочные программы.
This is obvious 06.07.2010 00:09 # +3
кстати по поводу матана: предлагаю разрешить анонимусам постить камменты при том, если оный прошёл матанокапчу, будет фильтровать от школоты всякой, хотя есть вероятность использования калькулятора, но до этого тяжко будет додуматся. Темболее если какое уравнение.
Говногость 06.07.2010 00:59 # +2
После такого гости начнут постить исключительно самые полезные комменты. Редким мазохистам захочется это решить ради какого-нибудь вебкиловского говнокомента.
This is obvious 06.07.2010 01:08 # +2
Анонимус 06.07.2010 03:56 # +4
bugmenot 06.07.2010 07:56 # +4
приаттачен файл Безымянный.bmp
nil 06.07.2010 08:02 # 0
А как быть с теми старперами, кто матан забыл еще тогда, когда ЦА капчи еще на свет не появились?:)
Говногость 06.07.2010 08:51 # +2
nil 06.07.2010 09:54 # +1
Stalker 08.07.2010 09:59 # +1
Остаток от деления на 077. Тут единичные биты суммируются по 3 в группе, потом берётся их общая сумма и проверяется на нечётность. Если сумма нечётная, то результат 1, иначе 0. Как-то так.
Аналогия в десятичной системе счисления:
203040607 % 99 == 22
(сумма цифр в 203040607)
3.14159265 08.07.2010 11:04 # 0
имелось ввиду взятие остатка от 99 в цикле и суммирование резалтов, поскольку во втором посте делается именно это не без цикла - 07+06+04+03+2 - верно?
3.14159265 08.07.2010 11:15 # 0
WebKill_HochetVBan 08.07.2010 14:18 # 0
3.14159265 05.07.2010 10:17 # 0
+1, в обоих случаях брутальный говноподход - в лоб
отличный линк кстати вот это n &= (n - 1) ; // вообще гениально
повторю свою уже стающую коронной фразу: на асме это делается в одну строку ))
popcnt eax
кстати по линку как использовать эту инструкцию в gnu
GNU compiler allows for
int __builtin_popcount (unsigned int x)
без асма (то есть если у меня было че-нить подревней Core 2) я бы сделал наверно таблицей, как в случае 3 Precompute.
3.14159265 05.07.2010 10:38 # 0
Говногость 05.07.2010 12:42 # +1
ageron 05.07.2010 10:47 # 0
int Xor4Bit_2 (unsigned char data)
{
int result = 0
while (data != 0)
{
result ^= data & 1;
data >>= 1;
}
return result;
}
причем сам алгоритм не зависит от типа данных
а извращаться искать и оптимизировать нужно исходя из задачи. Я показал как можно извратить вполне рабочий алгоритм который интуитивно прост и понятен а вы тут про оптимизацию и ассемблер. Если на то уж пошло для размерности в байт самой быстрой будет табличная функция на 256 элементов но оно кому-то надо?
3.14159265 05.07.2010 11:14 # +2
кстати этот алгоритм тоже интуитивно просто и понятен
int bitcount (unsigned int n) {
int count = 0 ;
while (n) {
count++ ;
n &= (n - 1) ;
}
return count ;
}
а работает раза в 2 быстрее, так что оба - говно, а еще и студентов этому учите
после сессии сюда студенты ложили свои высеры, а теперь и преподы подключились )))
Говногость 05.07.2010 12:45 # +1
3.14159265 05.07.2010 12:49 # 0
согласен, код в принципе неплох, тут и похлеще бывает
и все же кал, поскольку можно написать лучше/короче/быстрее
а студенты его договняют и постят в виде своих лаб ))
Stalker 05.07.2010 00:11 # 0
Говногость 05.07.2010 09:57 # +3
TarasB 05.07.2010 18:30 # 0
data^=(data >> 8)
data^=(data >> 4)
data^=(data >> 2)
data^=(data >> 1)
return data & 1
Говногость 05.07.2010 20:04 # +1
Лучше уж что-то типа:
Если компилятор сам не развернёт цикл, то можно будет развернуть его через шаблоны С++.
nil 05.07.2010 22:20 # +1
Говногость 05.07.2010 22:22 # 0
Говногость 05.07.2010 22:25 # +1
cfdev 06.07.2010 09:29 # +2
Мне, кстати, кто-то обещался провести тесты, доказывающие, что цикл быстрее развёртки, но так и не провёл.
Говногость 06.07.2010 11:11 # +3
Это не Я. :)
cfdev 06.07.2010 11:13 # +3
Говногость 06.07.2010 11:16 # +1
А разбирать меня не нужно. Я для этого не предназначен. Меня недавно только собирали.