Created
March 26, 2012 01:46
-
-
Save comuttun/2202181 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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