Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
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;
}
получил данный код после измышлизмов знакомого студента, перед этим дав ему рабочий вариант, мдя...
//оффтоп
кстати по поводу матана: предлагаю разрешить анонимусам постить камменты при том, если оный прошёл матанокапчу, будет фильтровать от школоты всякой, хотя есть вероятность использования калькулятора, но до этого тяжко будет додуматся. Темболее если какое уравнение.
Я за систему векторных уравнений с интегралами и частными производными. При этом, пускай это нужно решать перед каждым постингом коммента гостю.
После такого гости начнут постить исключительно самые полезные комменты. Редким мазохистам захочется это решить ради какого-нибудь вебкиловского говнокомента.
> % 63 Это что?
Остаток от деления на 077. Тут единичные биты суммируются по 3 в группе, потом берётся их общая сумма и проверяется на нечётность. Если сумма нечётная, то результат 1, иначе 0. Как-то так.
Аналогия в десятичной системе счисления:
203040607 % 99 == 22
(сумма цифр в 203040607)
конечно извиняюсь, то ли я не так понял пост, то ли в посте ошибка 203040607 % 99 = 07
имелось ввиду взятие остатка от 99 в цикле и суммирование резалтов, поскольку во втором посте делается именно это не без цикла - 07+06+04+03+2 - верно?
Ну это только если не нужно писать кросплатформенный код. Мне тоже ленно писать длиннющий цикл, если можно написать за строку. Действительно не во всех проектах нужна переносимость. Хотя, если над каким-то проектом планируется дороботка другим программистом, то это плохой тон.
Dummy, в студ поделках за производительностью не гоняться да и я пишу не протоколы работы с устройствами или алгоритмы шифрования/хеширования (хотя было и такое). но я точно знаю что вот это рабочее:
int Xor4Bit_2 (unsigned char data)
{
int result = 0
while (data != 0)
{
result ^= data & 1;
data >>= 1;
}
return result;
}
причем сам алгоритм не зависит от типа данных
а извращаться искать и оптимизировать нужно исходя из задачи. Я показал как можно извратить вполне рабочий алгоритм который интуитивно прост и понятен а вы тут про оптимизацию и ассемблер. Если на то уж пошло для размерности в байт самой быстрой будет табличная функция на 256 элементов но оно кому-то надо?
повторю в асме - это 1 (одна) строка, что может быть проще???
кстати этот алгоритм тоже интуитивно просто и понятен
int bitcount (unsigned int n) {
int count = 0 ;
while (n) {
count++ ;
n &= (n - 1) ;
}
return count ;
}
а работает раза в 2 быстрее, так что оба - говно, а еще и студентов этому учите
после сессии сюда студенты ложили свои высеры, а теперь и преподы подключились )))
>>не такой уж ужас
согласен, код в принципе неплох, тут и похлеще бывает
и все же кал, поскольку можно написать лучше/короче/быстрее
а студенты его договняют и постят в виде своих лаб ))
по мне так оба гавно. итерацию по битам можно сделать лучше. а для 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
Лучше уж что-то типа:
Если компилятор сам не развернёт цикл, то можно будет развернуть его через шаблоны С++.
Мне, кстати, кто-то обещался провести тесты, доказывающие, что цикл быстрее развёртки, но так и не провёл.
Это не Я. 🙂
А разбирать меня не нужно. Я для этого не предназначен. Меня недавно только собирали.