#include <ios>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
typedef unsigned char byte;
typedef struct bit_data {
byte *data;
size_t length;
} bit_data;
/*
Asume skip_n_bits will be 0 >= skip_n_bits <= 8
*/
bit_data *read(size_t n_bits, size_t skip_n_bits) {
bit_data *bits = (bit_data *) malloc(sizeof(struct bit_data));
size_t bytes_to_read = ceil(n_bits / 8.0);
size_t bytes_to_read_with_skip = ceil(n_bits / 8.0) + ceil(skip_n_bits / 8.0);
bits->data = (byte *) calloc(1, bytes_to_read);
bits->length = n_bits;
/* Hardcoded for the sake of this example*/
byte *tmp = (byte *) malloc(3);
tmp[0] = 'A'; tmp[1] = 'B'; tmp[2] = 'C';
/*not working*/
if(skip_n_bits > 0){
unsigned char *tmp2 = (unsigned char *) calloc(1, bytes_to_read_with_skip);
size_t i;
for(i = bytes_to_read_with_skip - 1; i > 0; i--) {
tmp2[i] = tmp[i] << skip_n_bits;
tmp2[i - 1] = (tmp[i - 1] << skip_n_bits) | (tmp[i] >> (8 - skip_n_bits));
}
memcpy(bits->data, tmp2, bytes_to_read);
free(tmp2);
}else{
memcpy(bits->data, tmp, bytes_to_read);
}
free(tmp);
return bits;
}
int main(void) {
//Reading "ABC"
//01000001 01000010 01000011
bit_data *res = read(8, 4);
cout << bitset<8>(*res->data);
cout << " -> Should be '00010100'";
return 0;
}
I2luY2x1ZGUgPGlvcz4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZTsKdHlwZWRlZiBzdHJ1Y3QgYml0X2RhdGEgewoJYnl0ZSAqZGF0YTsKCXNpemVfdCBsZW5ndGg7Cn0gYml0X2RhdGE7CgovKgogICBBc3VtZSBza2lwX25fYml0cyB3aWxsIGJlIDAgPj0gc2tpcF9uX2JpdHMgPD0gOAoqLwpiaXRfZGF0YSAqcmVhZChzaXplX3Qgbl9iaXRzLCBzaXplX3Qgc2tpcF9uX2JpdHMpIHsKCWJpdF9kYXRhICpiaXRzID0gKGJpdF9kYXRhICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGJpdF9kYXRhKSk7CgkKCXNpemVfdCBieXRlc190b19yZWFkID0gY2VpbChuX2JpdHMgLyA4LjApOwoJc2l6ZV90IGJ5dGVzX3RvX3JlYWRfd2l0aF9za2lwID0gY2VpbChuX2JpdHMgLyA4LjApICsgY2VpbChza2lwX25fYml0cyAvIDguMCk7CgkKCWJpdHMtPmRhdGEgPSAoYnl0ZSAqKSBjYWxsb2MoMSwgYnl0ZXNfdG9fcmVhZCk7CgliaXRzLT5sZW5ndGggPSBuX2JpdHM7CgkKCS8qIEhhcmRjb2RlZCBmb3IgdGhlIHNha2Ugb2YgdGhpcyBleGFtcGxlKi8KCWJ5dGUgKnRtcCA9IChieXRlICopIG1hbGxvYygzKTsKCXRtcFswXSA9ICdBJzsgdG1wWzFdID0gJ0InOyB0bXBbMl0gPSAnQyc7CgkKCS8qbm90IHdvcmtpbmcqLwoJaWYoc2tpcF9uX2JpdHMgPiAwKXsKCQl1bnNpZ25lZCBjaGFyICp0bXAyID0gKHVuc2lnbmVkIGNoYXIgKikgY2FsbG9jKDEsIGJ5dGVzX3RvX3JlYWRfd2l0aF9za2lwKTsKCQlzaXplX3QgaTsKCgkJZm9yKGkgPSBieXRlc190b19yZWFkX3dpdGhfc2tpcCAtIDE7IGkgPiAwOyBpLS0pIHsKCQkJdG1wMltpXSA9IHRtcFtpXSA8PCBza2lwX25fYml0czsKCQkJdG1wMltpIC0gMV0gPSAodG1wW2kgLSAxXSA8PCBza2lwX25fYml0cykgfCAodG1wW2ldID4+ICg4IC0gc2tpcF9uX2JpdHMpKTsKCQl9CgoJCW1lbWNweShiaXRzLT5kYXRhLCB0bXAyLCBieXRlc190b19yZWFkKTsKCQlmcmVlKHRtcDIpOwoJfWVsc2V7CgkJbWVtY3B5KGJpdHMtPmRhdGEsIHRtcCwgYnl0ZXNfdG9fcmVhZCk7Cgl9CglmcmVlKHRtcCk7CgoJcmV0dXJuIGJpdHM7Cn0KCmludCBtYWluKHZvaWQpIHsKCS8vUmVhZGluZyAiQUJDIgoJLy8wMTAwMDAwMSAwMTAwMDAxMCAwMTAwMDAxMQoJYml0X2RhdGEgKnJlcyA9IHJlYWQoOCwgNCk7CgoJY291dCA8PCBiaXRzZXQ8OD4oKnJlcy0+ZGF0YSk7Cgljb3V0IDw8ICIgLT4gU2hvdWxkIGJlICcwMDAxMDEwMCciOwoJCglyZXR1cm4gMDsKfQo=