void dec2bin(unsigned long long decimal, char *binary) {
  int k = 0, n = 0;
  int remain;
  char temp[80];
  do {
    remain = decimal % 2;
    decimal = decimal / 2;
    temp[k++] = remain + '0';
  } while (decimal > 0);
  for (int j = k; j < 64; j++)
    binary[n++] = '0';
  while (k >= 0)
    binary[n++] = temp[--k];
  binary[n - 1] = 0;
}


x86 assembly (clang, -O0):
<dec2bin>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x8(%rbp),%rax
and    $0x1,%rax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x8(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x14(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
cltq
mov    %cl,-0x70(%rbp,%rax,1)
cmpq   $0x0,-0x8(%rbp)
ja     111a <dec2bin+0x1a>
mov    -0x14(%rbp),%eax
mov    %eax,-0x74(%rbp)
cmpl   $0x40,-0x74(%rbp)
jge    1189 <dec2bin+0x89>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x18(%rbp)
movslq %ecx,%rcx
movb   $0x30,(%rax,%rcx,1)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    115b <dec2bin+0x5b>
jmp    118e <dec2bin+0x8e>
cmpl   $0x0,-0x14(%rbp)
jl     11c1 <dec2bin+0xc1>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cltq
mov    -0x70(%rbp,%rax,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x18(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    118e <dec2bin+0x8e>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<dec2bin>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x50,%rsp
mov    %rsi,%r14
mov    $0x1,%r12d
xor    %ebx,%ebx
mov    %rdi,%rax
nopl   0x0(%rax,%rax,1)
mov    %edi,%ecx
and    $0x1,%cl
shr    %rax
or     $0x30,%cl
mov    %cl,(%rsp,%rbx,1)
add    $0x1,%rbx
add    $0x1,%r12
cmp    $0x1,%rdi
mov    %rax,%rdi
ja     1130 <dec2bin+0x20>
lea    -0x1(%rbx),%r13
cmp    $0x3e,%r13d
ja     118c <dec2bin+0x7c>
cmp    $0x40,%ebx
mov    $0x3f,%r15d
cmovae %ebx,%r15d
sub    %rbx,%r15
mov    %r15d,%edx
add    $0x1,%rdx
mov    %r14,%rdi
mov    $0x30,%esi
call   1030 <memset@plt>
add    $0x1,%r15d
cmp    $0xe,%r13
jae    1199 <dec2bin+0x89>
jmp    12cf <dec2bin+0x1bf>
xor    %r15d,%r15d
cmp    $0xe,%r13
jb     12cf <dec2bin+0x1bf>
lea    0x1(%rbx),%rcx
movabs $0x7ffffffffffffff0,%rax
ff ff 7f
and    %rcx,%rax
movdqu -0x10(%rsp,%rbx,1),%xmm1
pxor   %xmm0,%xmm0
movdqa %xmm1,%xmm2
punpcklbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm2,%xmm1
movdqu %xmm1,(%r14,%r15,1)
cmp    $0x10,%rax
je     12b7 <dec2bin+0x1a7>
movdqu -0x20(%rsp,%rbx,1),%xmm1
movdqa %xmm1,%xmm2
punpcklbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm0
pshuflw $0x1b,%xmm0,%xmm0
pshufhw $0x1b,%xmm0,%xmm0
packuswb %xmm2,%xmm0
movdqu %xmm0,0x10(%r15,%r14,1)
cmp    $0x20,%rax
je     12b7 <dec2bin+0x1a7>
movdqu -0x30(%rsp,%rbx,1),%xmm1
pxor   %xmm0,%xmm0
movdqa %xmm1,%xmm2
punpcklbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm2,%xmm1
movdqu %xmm1,0x20(%r15,%r14,1)
cmp    $0x30,%rax
je     12b7 <dec2bin+0x1a7>
movdqu -0x40(%rsp,%rbx,1),%xmm1
movdqa %xmm1,%xmm2
punpcklbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm0
pshuflw $0x1b,%xmm0,%xmm0
pshufhw $0x1b,%xmm0,%xmm0
packuswb %xmm2,%xmm0
movdqu %xmm0,0x30(%r15,%r14,1)
cmp    %rax,%rcx
jne    12c5 <dec2bin+0x1b5>
add    %rax,%r15
add    $0xffffffffffffffff,%r15
jmp    12f4 <dec2bin+0x1e4>
and    $0xfffffffffffffff0,%r12
sub    %r12,%rbx
add    %rax,%r15
add    $0x1,%rbx
add    $0xffffffffffffffff,%r15
nopw   0x0(%rax,%rax,1)
movzbl -0x2(%rsp,%rbx,1),%eax
mov    %al,0x1(%r14,%r15,1)
add    $0x1,%r15
add    $0xffffffffffffffff,%rbx
jg     12e0 <dec2bin+0x1d0>
movslq %r15d,%rax
movb   $0x0,(%r14,%rax,1)
add    $0x50,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @dec2bin(i64 %0, i8* %1) {
%3 = alloca i64
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca [80 x i8]
%9 = alloca i32
store i64 %0, i64* %3
store i8* %1, i8** %4
store i32 0, i32* %5
store i32 0, i32* %6
br label %10
10: ; preds = %23, %2
%11 = load i64, i64* %3
%12 = urem i64 %11, 2
%13 = trunc i64 %12 to i32
store i32 %13, i32* %7
%14 = load i64, i64* %3
%15 = udiv i64 %14, 2
store i64 %15, i64* %3
%16 = load i32, i32* %7
%17 = add nsw i32 %16, 48
%18 = trunc i32 %17 to i8
%19 = load i32, i32* %5
%20 = add nsw i32 %19, 1
store i32 %20, i32* %5
%21 = sext i32 %19 to i64
%22 = getelementptr inbounds [80 x i8], [80 x i8]* %8, i64 0, i64 %21
store i8 %18, i8* %22
br label %23
23: ; preds = %10
%24 = load i64, i64* %3
%25 = icmp ugt i64 %24, 0
br i1 %25, label %10, label %26
26: ; preds = %23
%27 = load i32, i32* %5
store i32 %27, i32* %9
br label %28
28: ; preds = %37, %26
%29 = load i32, i32* %9
%30 = icmp slt i32 %29, 64
br i1 %30, label %31, label %40
31: ; preds = %28
%32 = load i8*, i8** %4
%33 = load i32, i32* %6
%34 = add nsw i32 %33, 1
store i32 %34, i32* %6
%35 = sext i32 %33 to i64
%36 = getelementptr inbounds i8, i8* %32, i64 %35
store i8 48, i8* %36
br label %37
37: ; preds = %31
%38 = load i32, i32* %9
%39 = add nsw i32 %38, 1
store i32 %39, i32* %9
br label %28
40: ; preds = %28
br label %41
41: ; preds = %44, %40
%42 = load i32, i32* %5
%43 = icmp sge i32 %42, 0
br i1 %43, label %44, label %55
44: ; preds = %41
%45 = load i32, i32* %5
%46 = add nsw i32 %45, -1
store i32 %46, i32* %5
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds [80 x i8], [80 x i8]* %8, i64 0, i64 %47
%49 = load i8, i8* %48
%50 = load i8*, i8** %4
%51 = load i32, i32* %6
%52 = add nsw i32 %51, 1
store i32 %52, i32* %6
%53 = sext i32 %51 to i64
%54 = getelementptr inbounds i8, i8* %50, i64 %53
store i8 %49, i8* %54
br label %41
55: ; preds = %41
%56 = load i8*, i8** %4
%57 = load i32, i32* %6
%58 = sub nsw i32 %57, 1
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8, i8* %56, i64 %59
store i8 0, i8* %60
ret void
}

LLVM IR (-O2):
define void @dec2bin(i64 %0, i8* nocapture writeonly %1) {
%3 = alloca [80 x i8]
%4 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 0
br label %5
5: ; preds = %5, %2
%6 = phi i64 [ %12, %5 ], [ 0, %2 ]
%7 = phi i64 [ %10, %5 ], [ %0, %2 ]
%8 = trunc i64 %7 to i8
%9 = and i8 %8, 1
%10 = lshr i64 %7, 1
%11 = or i8 %9, 48
%12 = add nuw nsw i64 %6, 1
%13 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %6
store i8 %11, i8* %13
%14 = icmp ult i64 %7, 2
br i1 %14, label %15, label %5
15: ; preds = %5
%16 = trunc i64 %6 to i32
%17 = trunc i64 %12 to i32
%18 = icmp ult i32 %16, 63
br i1 %18, label %19, label %27
19: ; preds = %15
%20 = call i32 @llvm.umax.i32(i32 %17, i32 63)
%21 = sub i32 %20, %17
%22 = zext i32 %21 to i64
%23 = add nuw nsw i64 %22, 1
%24 = add i32 %20, 1
%25 = sub i32 %24, %17
%26 = zext i32 %25 to i64
br label %27
27: ; preds = %15, %19
%28 = phi i64 [ 0, %15 ], [ %26, %19 ]
%29 = add nuw nsw i64 %6, 2
%30 = icmp ult i64 %6, 14
br i1 %30, label %79, label %31
31: ; preds = %27
%32 = and i64 %29, 9223372036854775792
%33 = sub nsw i64 %12, %32
%34 = add nuw i64 %28, %32
%35 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %6
%36 = getelementptr inbounds i8, i8* %35, i64 -15
%37 = bitcast i8* %36 to <16 x i8>*
%38 = load <16 x i8>, <16 x i8>* %37
%39 = shufflevector <16 x i8> %38, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%40 = getelementptr inbounds i8, i8* %1, i64 %28
%41 = bitcast i8* %40 to <16 x i8>*
store <16 x i8> %39, <16 x i8>* %41
%42 = icmp eq i64 %32, 16
br i1 %42, label %75, label %43
43: ; preds = %31
%44 = add nuw nsw i64 %28, 16
%45 = add nsw i64 %6, -16
%46 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %45
%47 = getelementptr inbounds i8, i8* %46, i64 -15
%48 = bitcast i8* %47 to <16 x i8>*
%49 = load <16 x i8>, <16 x i8>* %48
%50 = shufflevector <16 x i8> %49, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%51 = getelementptr inbounds i8, i8* %1, i64 %44
%52 = bitcast i8* %51 to <16 x i8>*
store <16 x i8> %50, <16 x i8>* %52
%53 = icmp eq i64 %32, 32
br i1 %53, label %75, label %54
54: ; preds = %43
%55 = add nuw nsw i64 %28, 32
%56 = add nsw i64 %6, -32
%57 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %56
%58 = getelementptr inbounds i8, i8* %57, i64 -15
%59 = bitcast i8* %58 to <16 x i8>*
%60 = load <16 x i8>, <16 x i8>* %59
%61 = shufflevector <16 x i8> %60, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%62 = getelementptr inbounds i8, i8* %1, i64 %55
%63 = bitcast i8* %62 to <16 x i8>*
store <16 x i8> %61, <16 x i8>* %63
%64 = icmp eq i64 %32, 48
br i1 %64, label %75, label %65
65: ; preds = %54
%66 = add nuw nsw i64 %28, 48
%67 = add nsw i64 %6, -48
%68 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %67
%69 = getelementptr inbounds i8, i8* %68, i64 -15
%70 = bitcast i8* %69 to <16 x i8>*
%71 = load <16 x i8>, <16 x i8>* %70
%72 = shufflevector <16 x i8> %71, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%73 = getelementptr inbounds i8, i8* %1, i64 %66
%74 = bitcast i8* %73 to <16 x i8>*
store <16 x i8> %72, <16 x i8>* %74
br label %75
75: ; preds = %65, %54, %43, %31
%76 = icmp eq i64 %29, %32
%77 = add nsw i64 %32, -1
%78 = add i64 %28, %77
br i1 %76, label %91, label %79
79: ; preds = %27, %75
%80 = phi i64 [ %12, %27 ], [ %33, %75 ]
%81 = phi i64 [ %28, %27 ], [ %34, %75 ]
br label %82
82: ; preds = %79, %82
%83 = phi i64 [ %85, %82 ], [ %80, %79 ]
%84 = phi i64 [ %90, %82 ], [ %81, %79 ]
%85 = add nsw i64 %83, -1
%86 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %85
%87 = load i8, i8* %86
%88 = getelementptr inbounds i8, i8* %1, i64 %84
store i8 %87, i8* %88
%89 = icmp sgt i64 %83, 0
%90 = add nuw nsw i64 %84, 1
br i1 %89, label %82, label %91
91: ; preds = %82, %75
%92 = phi i64 [ %78, %75 ], [ %84, %82 ]
%93 = shl i64 %92, 32
%94 = ashr exact i64 %93, 32
%95 = getelementptr inbounds i8, i8* %1, i64 %94
store i8 0, i8* %95
ret void
}