Skip to content

Instantly share code, notes, and snippets.

@marihachi
Created December 22, 2018 08:18
Show Gist options
  • Save marihachi/cb86a739fd3a8d928040fa9b927c468a to your computer and use it in GitHub Desktop.
Save marihachi/cb86a739fd3a8d928040fa9b927c468a to your computer and use it in GitHub Desktop.
任意のビット幅の2進数を加算演算するやつ
#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;
}
left = 0000000000000000000000000001101010101001100101101000011111001100
right = 0000000000000000000000000000000000000000000000110000100101011000
result = 0000000000000000000000000001101010101001100110011001000100100100
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment