Quick actions

cmd+k|ctrl+k

Navigation

Languages

print_internal_uint64_t register shuffle

Snippet info

Language

Cpp

Visibility

public

Author

evine

Created

2022-01-22T14:07:37.325591Z

Updated

2022-01-29T12:54:52.896585Z

#include <stdio.h>
#include <stdint.h>

typedef union {
    // UINT64_MAX is 20 bytes.
    char buffer[24];
    uint64_t group[3];
} Print_Buffer;

void print_internal_uint64_t(uint64_t v) {
    Print_Buffer output = {0};
    size_t i = 0;
    while(true) {
        i += 1;
        output.buffer[24 - i] = (v % 10) + '0';
        
        v /= 10;
        if(v == 0) {
            break;
        }
    }
    
    if(i <= 8) {
        size_t shift = 8 * (8 - i);
        output.group[0] = output.group[2] >> shift;
        output.group[1] = 0;
        output.group[2] = 0;
    } else if(i <= 16) {
        size_t shift = 8 * (16 - i);
        output.group[0] = output.group[1] >> shift;
        output.group[0] |= output.group[2] << (64 - shift);
        output.group[1] = output.group[2] >> shift;
        output.group[2] = 0;
    } else {
        size_t shift = 8 * (24 - i);
        output.group[0] >>= shift;
        output.group[0] |= output.group[1] << (64 - shift);
        output.group[1] >>= shift;
        output.group[1] |= output.group[2] << (64 - shift);
        output.group[2] >>= shift;
    }
    
    printf("%s\n", output.buffer);
}

void print_n(uint64_t v) {
    printf("uint64_t: ");
    print_internal_uint64_t(v);
}

void print_n(int64_t v) {
    printf("int64_t: ");
    if(v < 0) {
        printf("-");
        v = -v;
    }
    
    print_internal_uint64_t(v);
}

int main() {
    print_n(UINT64_MAX);
    print_n(0UL);
    print_n(1UL);
    print_n(9UL);
    print_n(50UL);
    print_n(62UL);
    print_n(73L);
    print_n(-84L);
    print_n(99999999L);
    print_n(45645656L);
    print_n(35123123123L);
    print_n(4564565645645656L);
    return 0;
}
INFO