Created
April 10, 2022 11:45
-
-
Save mrbid/a477f042da3dad14f13ef44f0644d851 to your computer and use it in GitHub Desktop.
Bitboolbench Solution 1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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