Skip to content

Instantly share code, notes, and snippets.

@mrbid
Created April 10, 2022 11:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrbid/a477f042da3dad14f13ef44f0644d851 to your computer and use it in GitHub Desktop.
Save mrbid/a477f042da3dad14f13ef44f0644d851 to your computer and use it in GitHub Desktop.
Bitboolbench Solution 1
#include <stdio.h>
#define uint unsigned int
unsigned char toByte(uint b[8])
{
unsigned char c = 0;
for(int i=0; i < 8; ++i)
if(b[i])
c |= 1 << i;
return c;
}
void fromByte(unsigned char c, uint b[8])
{
for(int i=0; i < 8; ++i)
b[i] = (c & (1<<i)) != 0;
}
int main()
{
uint i = 0;
unsigned char by;
uint bo[8] = {i, i-1, i-2, i-3, i-4, i-5, i-6, i-7}; // set bools
by = toByte(bo); // bools to byte
fromByte(by, &bo[8]); // byte to bools
printf("%c\n", by + bo[0] + bo[1] + bo[2] + bo[3] + bo[4] + bo[5] + bo[6] + bo[7]);
return 0;
}
/*
toByte:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-24], rdi
mov BYTE PTR [rbp-1], 0
mov DWORD PTR [rbp-8], 0
jmp .L2
.L4:
mov eax, DWORD PTR [rbp-8]
cdqe
lea rdx, [0+rax*4]
mov rax, QWORD PTR [rbp-24]
add rax, rdx
mov eax, DWORD PTR [rax]
test eax, eax
je .L3
mov eax, DWORD PTR [rbp-8]
mov edx, 1
mov ecx, eax
sal edx, cl
mov eax, edx
mov edx, eax
movzx eax, BYTE PTR [rbp-1]
or eax, edx
mov BYTE PTR [rbp-1], al
.L3:
add DWORD PTR [rbp-8], 1
.L2:
cmp DWORD PTR [rbp-8], 7
jle .L4
movzx eax, BYTE PTR [rbp-1]
pop rbp
ret
fromByte:
push rbp
mov rbp, rsp
mov eax, edi
mov QWORD PTR [rbp-32], rsi
mov BYTE PTR [rbp-20], al
mov DWORD PTR [rbp-4], 0
jmp .L7
.L8:
movzx edx, BYTE PTR [rbp-20]
mov eax, DWORD PTR [rbp-4]
mov ecx, eax
sar edx, cl
mov eax, edx
and eax, 1
test eax, eax
setne cl
mov eax, DWORD PTR [rbp-4]
cdqe
lea rdx, [0+rax*4]
mov rax, QWORD PTR [rbp-32]
add rdx, rax
movzx eax, cl
mov DWORD PTR [rdx], eax
add DWORD PTR [rbp-4], 1
.L7:
cmp DWORD PTR [rbp-4], 7
jle .L8
nop
nop
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 48
mov DWORD PTR [rbp-4], 0
// set bools
mov eax, DWORD PTR [rbp-4]
mov DWORD PTR [rbp-48], eax
mov eax, DWORD PTR [rbp-4]
sub eax, 1
mov DWORD PTR [rbp-44], eax
mov eax, DWORD PTR [rbp-4]
sub eax, 2
mov DWORD PTR [rbp-40], eax
mov eax, DWORD PTR [rbp-4]
sub eax, 3
mov DWORD PTR [rbp-36], eax
mov eax, DWORD PTR [rbp-4]
sub eax, 4
mov DWORD PTR [rbp-32], eax
mov eax, DWORD PTR [rbp-4]
sub eax, 5
mov DWORD PTR [rbp-28], eax
mov eax, DWORD PTR [rbp-4]
sub eax, 6
mov DWORD PTR [rbp-24], eax
mov eax, DWORD PTR [rbp-4]
sub eax, 7
mov DWORD PTR [rbp-20], eax
// bools to byte
lea rax, [rbp-48]
mov rdi, rax
call toByte
mov BYTE PTR [rbp-5], al
// byte to bools
movzx eax, BYTE PTR [rbp-5]
lea rdx, [rbp-48]
add rdx, 32
mov rsi, rdx
mov edi, eax
call fromByte
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment