- 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;
}
получил данный код после измышлизмов знакомого студента, перед этим дав ему рабочий вариант, мдя...
по мне так оба гавно. итерацию по битам можно сделать лучше. а для uint8_t можно и вообще без циклов.
http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/
Это что?
А вообще - остаток от деления.
>Это что?
Не подъёмный матан для любителей писать прозрачные легко поддерживаемые обновляемые почти безошибочные программы.
кстати по поводу матана: предлагаю разрешить анонимусам постить камменты при том, если оный прошёл матанокапчу, будет фильтровать от школоты всякой, хотя есть вероятность использования калькулятора, но до этого тяжко будет додуматся. Темболее если какое уравнение.
После такого гости начнут постить исключительно самые полезные комменты. Редким мазохистам захочется это решить ради какого-нибудь вебкиловского говнокомента.
приаттачен файл Безымянный.bmp
А как быть с теми старперами, кто матан забыл еще тогда, когда ЦА капчи еще на свет не появились?:)
Остаток от деления на 077. Тут единичные биты суммируются по 3 в группе, потом берётся их общая сумма и проверяется на нечётность. Если сумма нечётная, то результат 1, иначе 0. Как-то так.
Аналогия в десятичной системе счисления:
203040607 % 99 == 22
(сумма цифр в 203040607)
имелось ввиду взятие остатка от 99 в цикле и суммирование резалтов, поскольку во втором посте делается именно это не без цикла - 07+06+04+03+2 - верно?
+1, в обоих случаях брутальный говноподход - в лоб
отличный линк кстати вот это n &= (n - 1) ; // вообще гениально
повторю свою уже стающую коронной фразу: на асме это делается в одну строку ))
popcnt eax
кстати по линку как использовать эту инструкцию в gnu
GNU compiler allows for
int __builtin_popcount (unsigned int x)
без асма (то есть если у меня было че-нить подревней Core 2) я бы сделал наверно таблицей, как в случае 3 Precompute.
int Xor4Bit_2 (unsigned char data)
{
int result = 0
while (data != 0)
{
result ^= data & 1;
data >>= 1;
}
return result;
}
причем сам алгоритм не зависит от типа данных
а извращаться искать и оптимизировать нужно исходя из задачи. Я показал как можно извратить вполне рабочий алгоритм который интуитивно прост и понятен а вы тут про оптимизацию и ассемблер. Если на то уж пошло для размерности в байт самой быстрой будет табличная функция на 256 элементов но оно кому-то надо?
кстати этот алгоритм тоже интуитивно просто и понятен
int bitcount (unsigned int n) {
int count = 0 ;
while (n) {
count++ ;
n &= (n - 1) ;
}
return count ;
}
а работает раза в 2 быстрее, так что оба - говно, а еще и студентов этому учите
после сессии сюда студенты ложили свои высеры, а теперь и преподы подключились )))
согласен, код в принципе неплох, тут и похлеще бывает
и все же кал, поскольку можно написать лучше/короче/быстрее
а студенты его договняют и постят в виде своих лаб ))
data^=(data >> 8)
data^=(data >> 4)
data^=(data >> 2)
data^=(data >> 1)
return data & 1
Лучше уж что-то типа:
Если компилятор сам не развернёт цикл, то можно будет развернуть его через шаблоны С++.
Мне, кстати, кто-то обещался провести тесты, доказывающие, что цикл быстрее развёртки, но так и не провёл.
Это не Я. :)
А разбирать меня не нужно. Я для этого не предназначен. Меня недавно только собирали.