Skip to content

Instantly share code, notes, and snippets.

@comuttun
Created March 26, 2012 01:46
Show Gist options
  • Select an option

  • Save comuttun/2202181 to your computer and use it in GitHub Desktop.

Select an option

Save comuttun/2202181 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#define COUNTER_RIGHT_BITS 24
#define COUNTER_MASK 0x000000ff
#define ADDER_RIGHT_BITS 16
#define ADDER_MASK 0x000000ff
#define SUM_MASK 0x0000ffff
#define extract_sum(v) (v & SUM_MASK)
#define add_to_sum(v, w) (extract_sum(v) + w)
#define extract_adder(v) ((v >> ADDER_RIGHT_BITS) & ADDER_MASK)
#define shift_adder(v) (v << ADDER_RIGHT_BITS)
#define extract_counter(v) ((v >> COUNTER_RIGHT_BITS) & COUNTER_MASK)
#define shift_counter(v) (v << COUNTER_RIGHT_BITS)
#define make_x(s, a, c) ((s & SUM_MASK) | shift_adder(a) | shift_counter(c))
int sum_with_one_var(int from, int to) {
int x = make_x(0, from - 1, 0);
while (1) {
x = make_x(add_to_sum(x, extract_adder(x) + 1),
extract_adder(x) + 1,
extract_counter(x) + 1);
if (extract_counter(x) == (to - from + 1))
break;
}
return extract_sum(x);
}
int sum_normally(int from, int to) {
int sum = 0;
int adder = from - 1;
int i;
for (i = 0; i < (to - from + 1); i++) {
sum += adder + 1;
adder += 1;
}
return sum;
}
int main(int argc, char** argv) {
if (argc != 3) {
fprintf(stderr, "Bad argument\n");
fprintf(stderr, "Usage: %s <from> <to>\n", argv[0]);
exit(1);
}
int from = atoi(argv[1]);
int to = atoi(argv[2]);
printf("sum_with_one_var: %d\n", sum_with_one_var(from ,to));
printf("sum_normally: %d\n", sum_normally(from, to));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment