От Восхищения Хакера, p. 66, рисунок 5-2
int pop(unsigned x)
{
x = x - ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x + (x >> 4)) & 0x0F0F0F0F;
x = x + (x >> 8);
x = x + (x >> 16);
return x & 0x0000003F;
}
Выполняется в инструкциях ~20-выхода (зависимый дуги), никакое ветвление.
Восхищение Хакера восхитительно! Наиболее рекомендуемый.
Для использования обоих сигналов, необходимо включать signal.h
, как этот пример, взятый от страница Wikipedia, связанная с сигналами C:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
static void catch_function(int signo) {
puts("Interactive attention signal caught.");
}
int main(void) {
if (signal(SIGINT, catch_function) == SIG_ERR) {
fputs("An error occurred while setting a signal handler.\n", stderr);
return EXIT_FAILURE;
}
puts("Raising the interactive attention signal.");
if (raise(SIGINT) != 0) {
fputs("Error raising the signal.\n", stderr);
return EXIT_FAILURE;
}
puts("Exiting.");
return 0;
}