codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#include <stdio.h> struct INT128 { unsigned char i[16]; }; void right_shift_INT128(struct INT128* a, int b); void left_shift_INT128(struct INT128* a, int b); // INT128 ← char[16] void write_INT128(struct INT128* d, unsigned char* s) { unsigned char* p = d->i; int i=16; while(i-->0){ *p++ = *s++; } } // char[16] ← INT128 void read_INT128(struct INT128* s, unsigned char* d) { unsigned char* p = s->i; int i=16; while(i-->0){ *d++ = *p++; } } // INT128 ← 0 void write_zero_INT128(struct INT128* d) { unsigned char* p = d->i; int i=16; while(i-->0){ *p++ = 0; } } // a = a + b void add_INT128(struct INT128* a, struct INT128* b) { unsigned char* ap = a->i; unsigned char* bp = b->i; unsigned short c = 0; int i=16; while(i-->0){ c = ((unsigned short)*ap) + ((unsigned short)*bp) + (c>>8); *ap = (unsigned char)c; ap++; bp++; } } // a = b void mov_INT128(struct INT128* a,struct INT128* b) { int i; for(i=0;i<16;i++){ a->i[i] = b->i[i];} } // a = ~a void not_INT128(struct INT128* a) { int i; for(i=0;i<16;i++){ a->i[i] = ~(a->i[i]);} } // a = a - b void sub_INT128(struct INT128* a, struct INT128* b) { struct INT128 c; struct INT128 const1={1}; mov_INT128(&c,b); not_INT128(&c); add_INT128(&c,&const1); add_INT128(a,&c); } // a = a >> 1 void right_shift_1_INT128(struct INT128* a) { int i; unsigned char c; for(i=16;i;) { i--; c=a->i[i]&1; a->i[i]/=2; if(i && c) { a->i[i-1]|=0x80; } } } // a = a << 1 void left_shift_1_INT128(struct INT128* a) { int i; unsigned char c=0,cc; for(i=0;i<16;i++) { i--; cc=(a->i[i]&0x80)/0x80; a->i[i]*=2; a->i[i]|=c; c=cc; } } // a = a * b void mul_INT128(struct INT128* a, struct INT128* b) { // } // a = a / b void div_INT128(struct INT128* a, struct INT128* b) { // } // a = a >> b void right_shift_INT128(struct INT128* a, int b) { if (b >= 128) { write_zero_INT128(a); return; } if (b < 0) { left_shift_INT128(a, -b); return; } unsigned char* p = a->i + (16 - 1); unsigned int segment = b / 8; unsigned int offset = b % 8; unsigned short c = 0; int i=16; while(i-->0){ c = (((unsigned short)*p) << (8 - offset)) | (c << 8); *p-- = (unsigned char)(c >> 8); } unsigned char* sp = a->i + segment; unsigned char* dp = a->i; i = 16 - segment; while(i-->0){ *dp++ = *sp++; } i = segment; while(i-->0){ *dp++ = 0; } } // a = a << b void left_shift_INT128(struct INT128* a, int b) { } // a = a & b void and_INT128(struct INT128* a, struct INT128* b) { int i=16; while(i--) { a->i[i]&=b->i[i];} } // a = a | b void or_INT128(struct INT128* a, struct INT128* b) { int i=16; while(i--) { a->i[i]|=b->i[i];} } // a = a ^ b void xor_INT128(struct INT128* a, struct INT128* b) { int i=16; while(i--) { a->i[i]^=b->i[i];} } void print_0x_INT128(struct INT128* a) { printf("0x"); unsigned char* p = a->i + (16 - 1); int i=16; while(i-->0){ printf("%02X", *p--); } } //test void main() { unsigned char c[16] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160}; struct INT128 a; write_INT128(&a,c); struct INT128 b; write_INT128(&b,c); // add test printf("add test\n"); printf("a = "); print_0x_INT128(&a); printf("\n"); printf("b = "); print_0x_INT128(&b); printf("\n"); printf("a = a + b\n"); add_INT128(&a,&b); printf("a = "); print_0x_INT128(&a); printf("\n"); // right shift test int right_shift = 81; printf("right shift test\n"); printf("a = "); print_0x_INT128(&a); printf("\n"); printf("right shift = %d\n", right_shift); printf("a = a >> %d\n", right_shift); right_shift_INT128(&a, right_shift); printf("a = "); print_0x_INT128(&a); printf("\n"); }
Private
[
?
]
Run code
Submit