#include <stdio.h>
#include <limits.h>
static void reverse(char* buf, size_t size)
{
for (size_t i = 0; i < size/2; ++i) {
// swap i <-> (size - i - 1)
char temp = buf[i];
buf[i] = buf[size - i - 1];
buf[size - i - 1] = temp;
}
}
static int to_binary_unsigned(unsigned int x, char* buf, size_t size)
{
if (!buf || size < 2)
return -1; // error
buf[0] = '\0';
size_t i = 1;
for ( ; i < size; ++i) {
buf[i] = "01"[x & 1];
x >>= 1;
if (x == 0)
break;
}
if (i == size)
return -1; // error
reverse(buf, i + 1);
return 0; // success
}
static int to_binary(int x, char* buf, size_t size)
{
if (x < 0) {
if (buf && size > 2)
*buf = '-'; // write sign
else
return -1; // error
return to_binary_unsigned(-(unsigned int)x, buf+1, size-1);
}
return to_binary_unsigned(x, buf, size);
}
int main(void)
{
int x;
char buf[2 + CHAR_BIT * sizeof x]; // sign + null + binary digits
to_binary(x, buf, sizeof buf);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KICAgIApzdGF0aWMgdm9pZCByZXZlcnNlKGNoYXIqIGJ1Ziwgc2l6ZV90IHNpemUpCnsKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUvMjsgKytpKSB7CiAgICAvLyBzd2FwIGkgPC0+IChzaXplIC0gaSAtIDEpCiAgICBjaGFyIHRlbXAgPSBidWZbaV07CiAgICBidWZbaV0gPSBidWZbc2l6ZSAtIGkgLSAxXTsKICAgIGJ1ZltzaXplIC0gaSAtIDFdID0gdGVtcDsKICB9Cn0KICAgIAogICAgCnN0YXRpYyBpbnQgdG9fYmluYXJ5X3Vuc2lnbmVkKHVuc2lnbmVkIGludCB4LCBjaGFyKiBidWYsIHNpemVfdCBzaXplKQp7CiAgaWYgKCFidWYgfHwgc2l6ZSA8IDIpCiAgICByZXR1cm4gLTE7IC8vIGVycm9yCiAgICAKICBidWZbMF0gPSAnXDAnOwogIHNpemVfdCBpID0gMTsKICBmb3IgKCA7IGkgPCBzaXplOyArK2kpIHsKICAgIGJ1ZltpXSA9ICIwMSJbeCAmIDFdOwogICAgeCA+Pj0gMTsKICAgIGlmICh4ID09IDApCiAgICAgIGJyZWFrOwogIH0KICBpZiAoaSA9PSBzaXplKQogICAgcmV0dXJuIC0xOyAvLyBlcnJvcgogIHJldmVyc2UoYnVmLCBpICsgMSk7CiAgcmV0dXJuIDA7IC8vIHN1Y2Nlc3MKfQogICAgCnN0YXRpYyBpbnQgdG9fYmluYXJ5KGludCB4LCBjaGFyKiBidWYsIHNpemVfdCBzaXplKQp7CiAgaWYgKHggPCAwKSB7CiAgICBpZiAoYnVmICYmIHNpemUgPiAyKQogICAgICAqYnVmID0gJy0nOyAvLyB3cml0ZSBzaWduCiAgICBlbHNlCiAgICAgIHJldHVybiAtMTsgLy8gZXJyb3IKICAgIHJldHVybiB0b19iaW5hcnlfdW5zaWduZWQoLSh1bnNpZ25lZCBpbnQpeCwgYnVmKzEsIHNpemUtMSk7CiAgfQogIHJldHVybiB0b19iaW5hcnlfdW5zaWduZWQoeCwgYnVmLCBzaXplKTsKfQogICAgCiAgICAKaW50IG1haW4odm9pZCkKewogIGludCB4OwogIHNjYW5mKCIlZCIsICZ4KTsKICBjaGFyIGJ1ZlsyICsgQ0hBUl9CSVQgKiBzaXplb2YgeF07IC8vIHNpZ24gKyBudWxsICsgYmluYXJ5IGRpZ2l0cwogIHRvX2JpbmFyeSh4LCBidWYsIHNpemVvZiBidWYpOwogIHB1dHMoYnVmKTsKfQ==