#include <stdio.h>
#include <stdlib.h>
char* __private_to_binary_representation(int n, char* print_here, int pos) {
//printf("pos %d, n %d\n", pos, n);
if (n == 0) {
return print_here;
}
print_here = __private_to_binary_representation(n >> 1, print_here, pos + 1);
(*print_here) = (n & 1) + '0';
//printf("pos %d, n %d, n & 1 %d, *print_here %c\n", pos, n, n & 1, *print_here);
return print_here + 1;
}
char* to_binary_representation(int n, char* print_here) {
int is_negative = n < 0? 1: 0;
// primeiro, preencho o valor absoluto do número, então o primeiro bit sempre será 0
char* null_terminator_pos
= __private_to_binary_representation
(abs(n
), print_here
+ 1, 0); print_here[0] = '0';
// garantindo o final da string
(*null_terminator_pos) = '\0';
if (is_negative) {
char* bit_check;
int bit1_found = 0;
for (bit_check = null_terminator_pos - 1; bit_check >= print_here; bit_check--) {
// troca os bits na representação de complemento de 2
if (bit1_found) {
(*bit_check) = (*bit_check) == '1'? '0': '1';
} else if ((*bit_check) == '1') {
bit1_found = 1;
}
}
}
return print_here;
}
int main(void) {
char buff[100];
printf("to_binary_representation(%d), %s\n", 0, to_binary_representation
(0, buff
)); printf("to_binary_representation(%d), %s\n", 1, to_binary_representation
(1, buff
)); printf("to_binary_representation(%d), %s\n", 5, to_binary_representation
(5, buff
)); printf("to_binary_representation(%d), %s\n", -5, to_binary_representation
(-5, buff
)); printf("to_binary_representation(%d), %s\n", -1, to_binary_representation
(-1, buff
)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiAgICBjaGFyKiBfX3ByaXZhdGVfdG9fYmluYXJ5X3JlcHJlc2VudGF0aW9uKGludCBuLCBjaGFyKiBwcmludF9oZXJlLCBpbnQgcG9zKSB7CiAgICAgIC8vcHJpbnRmKCJwb3MgJWQsIG4gJWRcbiIsIHBvcywgbik7CiAgICAgIGlmIChuID09IDApIHsKICAgICAgICByZXR1cm4gcHJpbnRfaGVyZTsKICAgICAgfQogICAgICBwcmludF9oZXJlID0gX19wcml2YXRlX3RvX2JpbmFyeV9yZXByZXNlbnRhdGlvbihuID4+IDEsIHByaW50X2hlcmUsIHBvcyArIDEpOwogICAgICAoKnByaW50X2hlcmUpID0gKG4gJiAxKSArICcwJzsKICAgICAgLy9wcmludGYoInBvcyAlZCwgbiAlZCwgbiAmIDEgJWQsICpwcmludF9oZXJlICVjXG4iLCBwb3MsIG4sIG4gJiAxLCAqcHJpbnRfaGVyZSk7CiAgICAgIHJldHVybiBwcmludF9oZXJlICsgMTsKICAgIH0KCiAgICBjaGFyKiB0b19iaW5hcnlfcmVwcmVzZW50YXRpb24oaW50IG4sIGNoYXIqIHByaW50X2hlcmUpIHsKICAgICAgaW50IGlzX25lZ2F0aXZlID0gbiA8IDA/IDE6IDA7CiAgICAgIC8vIHByaW1laXJvLCBwcmVlbmNobyBvIHZhbG9yIGFic29sdXRvIGRvIG7Dum1lcm8sIGVudMOjbyBvIHByaW1laXJvIGJpdCBzZW1wcmUgc2Vyw6EgMAogICAgICBjaGFyKiBudWxsX3Rlcm1pbmF0b3JfcG9zID0gX19wcml2YXRlX3RvX2JpbmFyeV9yZXByZXNlbnRhdGlvbihhYnMobiksIHByaW50X2hlcmUgKyAxLCAwKTsKICAgICAgcHJpbnRfaGVyZVswXSA9ICcwJzsKICAgICAgCiAgICAgIC8vIGdhcmFudGluZG8gbyBmaW5hbCBkYSBzdHJpbmcKICAgICAgKCpudWxsX3Rlcm1pbmF0b3JfcG9zKSA9ICdcMCc7CiAgICAgIAogICAgICBpZiAoaXNfbmVnYXRpdmUpIHsKICAgICAgICBjaGFyKiBiaXRfY2hlY2s7CiAgICAgICAgaW50IGJpdDFfZm91bmQgPSAwOwogICAgICAgIGZvciAoYml0X2NoZWNrID0gbnVsbF90ZXJtaW5hdG9yX3BvcyAtIDE7IGJpdF9jaGVjayA+PSBwcmludF9oZXJlOyBiaXRfY2hlY2stLSkgewogICAgICAgICAgLy8gdHJvY2Egb3MgYml0cyBuYSByZXByZXNlbnRhw6fDo28gZGUgY29tcGxlbWVudG8gZGUgMgogICAgICAgICAgaWYgKGJpdDFfZm91bmQpIHsKICAgICAgICAgICAgKCpiaXRfY2hlY2spID0gKCpiaXRfY2hlY2spID09ICcxJz8gJzAnOiAnMSc7CiAgICAgICAgICB9IGVsc2UgaWYgKCgqYml0X2NoZWNrKSA9PSAnMScpIHsKICAgICAgICAgICAgYml0MV9mb3VuZCA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwcmludF9oZXJlOwogICAgfQoKaW50IG1haW4odm9pZCkgewoJY2hhciBidWZmWzEwMF07CglwcmludGYoInRvX2JpbmFyeV9yZXByZXNlbnRhdGlvbiglZCksICVzXG4iLCAwLCB0b19iaW5hcnlfcmVwcmVzZW50YXRpb24oMCwgYnVmZikpOwoJcHJpbnRmKCJ0b19iaW5hcnlfcmVwcmVzZW50YXRpb24oJWQpLCAlc1xuIiwgMSwgdG9fYmluYXJ5X3JlcHJlc2VudGF0aW9uKDEsIGJ1ZmYpKTsKCXByaW50ZigidG9fYmluYXJ5X3JlcHJlc2VudGF0aW9uKCVkKSwgJXNcbiIsIDUsIHRvX2JpbmFyeV9yZXByZXNlbnRhdGlvbig1LCBidWZmKSk7CglwcmludGYoInRvX2JpbmFyeV9yZXByZXNlbnRhdGlvbiglZCksICVzXG4iLCAtNSwgdG9fYmluYXJ5X3JlcHJlc2VudGF0aW9uKC01LCBidWZmKSk7CglwcmludGYoInRvX2JpbmFyeV9yZXByZXNlbnRhdGlvbiglZCksICVzXG4iLCAtMSwgdG9fYmluYXJ5X3JlcHJlc2VudGF0aW9uKC0xLCBidWZmKSk7CglyZXR1cm4gMDsKfQo=