diff options
author | justanothercatgirl <sotov@twistea.su> | 2024-12-06 16:24:22 +0300 |
---|---|---|
committer | justanothercatgirl <sotov@twistea.su> | 2024-12-06 16:24:22 +0300 |
commit | d62443adaba86f94866e5d3f4eaf4e113a13e6fc (patch) | |
tree | b9b2f21803da166f43ab60ad91627055b5340cf0 /7_1/main.c | |
parent | 24b8430fa7a9a81b88c5c172c99bbc9a520ff4ba (diff) |
added 7.1
Diffstat (limited to '7_1/main.c')
-rw-r--r-- | 7_1/main.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/7_1/main.c b/7_1/main.c new file mode 100644 index 0000000..ef4536b --- /dev/null +++ b/7_1/main.c @@ -0,0 +1,46 @@ +#include<stdlib.h> +#include<stdio.h> + +/* бля какой же код охуенный */ +/* ломается, если x = 0x8000000000000000 */ +char* tobin(long int x) { + size_t i = 0, j = 0; + char buffer[64]; + char *ret; + char sgn = x < 0; + + x *= ((x > 0) << 1) - 1; + printf("%li\n", x); + for (; x; x >>= 1) buffer[i++] = '0' + (x & 1); + ret = calloc(i + 1 + sgn, sizeof *ret); + ret[0] = '-'; + j += sgn; + while (i) ret[j++] = buffer[--i]; + + return ret; +} + +int main(int argc, char* argv[]) { + long number; + char *bin; + + if (argc != 2) { + fprintf(stderr, "\x1b[91mError: Invalid amount of arguments\x1b[0m\n" + "Usage: \x1b[92m%s <number>\n\x1b[0m", argv[0]); + return 1; + } + + number = atol(argv[1]); + if (number == 0) { + puts("Binary for 0: 0"); + return 0; + } + if (number == 0x8000000000000000) { + puts("Aha, I see what you did there)"); + return 1; + } + bin = tobin(number); + printf("Binary for %li: %s\n", number, bin); + free(bin); + return 0; +} |