Created
December 22, 2018 08:18
-
-
Save marihachi/cb86a739fd3a8d928040fa9b927c468a to your computer and use it in GitHub Desktop.
任意のビット幅の2進数を加算演算するやつ
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> | |
#define BIT_WIDTH 64 | |
#define SUMS_SIZE BIT_WIDTH + 1 | |
void half_adder(unsigned char left, unsigned char right, unsigned char *sum_out, unsigned char *career_out) | |
{ | |
*sum_out = left ^ right; | |
*career_out = left & right; | |
} | |
void full_adder(unsigned char left, unsigned char right, unsigned char x, unsigned char *sum_out, unsigned char *career_out) | |
{ | |
unsigned char sum1, career1, sum2, career2; | |
half_adder(left, right, &sum1, &career1); | |
half_adder(sum1, x, sum_out, &career2); | |
*career_out = career1 | career2; | |
} | |
void add(const unsigned char left[], const unsigned char right[], unsigned int bit_width, unsigned char *result_out) | |
{ | |
int i; | |
unsigned char career; | |
half_adder(left[0], right[0], &result_out[0], &career); | |
for (i = 0; i < bit_width - 1; i++) { | |
full_adder(left[i + 1], right[i + 1], career, &result_out[i + 1], &career); | |
} | |
} | |
int main(void) | |
{ | |
unsigned char a[BIT_WIDTH] = {0}; | |
unsigned char b[BIT_WIDTH] = {0}; | |
unsigned char result[SUMS_SIZE]; | |
int i, rev_i; | |
// 114514364364 | |
a[2] = 1; | |
a[3] = 1; | |
a[6] = 1; | |
a[7] = 1; | |
a[8] = 1; | |
a[9] = 1; | |
a[10] = 1; | |
a[15] = 1; | |
a[17] = 1; | |
a[18] = 1; | |
a[20] = 1; | |
a[23] = 1; | |
a[24] = 1; | |
a[27] = 1; | |
a[29] = 1; | |
a[31] = 1; | |
a[33] = 1; | |
a[35] = 1; | |
a[36] = 1; | |
// 199000 | |
b[3] = 1; | |
b[4] = 1; | |
b[6] = 1; | |
b[8] = 1; | |
b[11] = 1; | |
b[16] = 1; | |
b[17] = 1; | |
printf("left = "); | |
for (i = 0; i < BIT_WIDTH; i++) { | |
rev_i = BIT_WIDTH - i - 1; | |
printf("%d", a[rev_i]); | |
} | |
printf("\n"); | |
printf("right = "); | |
for (i = 0; i < BIT_WIDTH; i++) { | |
rev_i = BIT_WIDTH - i - 1; | |
printf("%d", b[rev_i]); | |
} | |
printf("\n"); | |
add(a, b, BIT_WIDTH, result); | |
printf("result = "); | |
for (i = 0; i < BIT_WIDTH; i++) { | |
rev_i = BIT_WIDTH - i - 1; | |
printf("%d", result[rev_i]); | |
} | |
printf("\n"); | |
return 0; | |
} |
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
left = 0000000000000000000000000001101010101001100101101000011111001100 | |
right = 0000000000000000000000000000000000000000000000110000100101011000 | |
result = 0000000000000000000000000001101010101001100110011001000100100100 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment