day 5, pretty blinkenlights mem, awful performance
This commit is contained in:
85
lib.h
85
lib.h
@@ -34,6 +34,7 @@ void exit_group(uint64_t code) {
|
||||
#define str(s) #s
|
||||
|
||||
typedef uint64_t bcdint;
|
||||
typedef uint64_t num;
|
||||
|
||||
static
|
||||
void printns(size_t len, unsigned char chars[len]) {
|
||||
@@ -81,6 +82,23 @@ void printd(unsigned long v) {
|
||||
write(STDOUT_FILENO, p, count);
|
||||
}
|
||||
|
||||
static
|
||||
void snprintd(unsigned long v, size_t n, unsigned char d[n]) {
|
||||
memset(d, 0, n);
|
||||
if (!v) {
|
||||
d[n-1] = '0';
|
||||
return;
|
||||
}
|
||||
unsigned char *p = d+n;
|
||||
unsigned count = 0;
|
||||
while (v) {
|
||||
p--;
|
||||
*p = '0' + (v % 10);
|
||||
v /= 10;
|
||||
if (p == d) return;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void printh(unsigned long v) {
|
||||
if (!v) {
|
||||
@@ -103,6 +121,28 @@ void printh(unsigned long v) {
|
||||
write(STDOUT_FILENO, p, count);
|
||||
}
|
||||
|
||||
static
|
||||
void snprinth(unsigned long v, size_t n, unsigned char d[n]) {
|
||||
memset(d, 0, n);
|
||||
if (!v) {
|
||||
d[n-1] = '0';
|
||||
return;
|
||||
}
|
||||
unsigned char *p = d+n;
|
||||
unsigned count = 0;
|
||||
while (v) {
|
||||
p--;
|
||||
if ((v & 0x0F) < 0xA) {
|
||||
*p = '0' + (v & 0x0F);
|
||||
} else {
|
||||
*p = 'A' - 0xA + (v & 0x0F);
|
||||
}
|
||||
v >>= 4;
|
||||
if (p == d) return;
|
||||
}
|
||||
while (p >= d) *p-- = 0;
|
||||
}
|
||||
|
||||
static
|
||||
void print_hex_char(unsigned char v) {
|
||||
char buf[2];
|
||||
@@ -169,3 +209,48 @@ static bcdint bcdadd(bcdint a, bcdint b) {
|
||||
t2 = (t2 >> 2) | (t2 >> 3);
|
||||
return t1 - t2;
|
||||
}
|
||||
|
||||
// https://homepage.cs.uiowa.edu/~jones/bcd/bcd.html
|
||||
static bcdint bcdcomp(bcdint a) {
|
||||
bcdint t1, t2, t3, t4, t5, t6;
|
||||
t1 = 0xFFFFFFFFFFFFFFFF - a;
|
||||
t2 = - a;
|
||||
t3 = t1 ^ 0x0000000000000001;
|
||||
t4 = t2 ^ t3;
|
||||
t5 = ~t4 & 0x1111111111111110;
|
||||
t6 = (t5 >> 2) | (t5 >> 3);
|
||||
return t2 - t6;
|
||||
}
|
||||
|
||||
static bcdint bcdsub(bcdint a, bcdint b) {
|
||||
return bcdadd(a, bcdcomp(b));
|
||||
}
|
||||
|
||||
static num bcdtonum(bcdint a) {
|
||||
return 0
|
||||
+ ((a >> 0) & 0xF) * 1
|
||||
+ ((a >> 4) & 0xF) * 10
|
||||
+ ((a >> 8) & 0xF) * 100
|
||||
+ ((a >> 12) & 0xF) * 1000
|
||||
+ ((a >> 16) & 0xF) * 10000
|
||||
+ ((a >> 24) & 0xF) * 100000
|
||||
+ ((a >> 28) & 0xF) * 1000000
|
||||
+ ((a >> 32) & 0xF) * 10000000
|
||||
+ ((a >> 36) & 0xF) * 100000000
|
||||
+ ((a >> 40) & 0xF) * 1000000000
|
||||
+ ((a >> 44) & 0xF) * 10000000000
|
||||
+ ((a >> 48) & 0xF) * 100000000000
|
||||
+ ((a >> 52) & 0xF) * 1000000000000
|
||||
+ ((a >> 56) & 0xF) * 10000000000000
|
||||
+ ((a >> 60) & 0xF) * 100000000000000;
|
||||
}
|
||||
|
||||
static bcdint numtobcd(num a) {
|
||||
bcdint r = 0;
|
||||
while (a) {
|
||||
r <<= 4;
|
||||
r |= (a % 10);
|
||||
a /= 10;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user