我正在制作一个程序,用μC接收一堆0和1,并且需要从任何位置获取任意数量的位(1到16)。
即。我有150位,我想从第32位取6位并将其复制到char(8位)变量;我知道我可以通过保存为ASCII 0和1来使用字符串,但我没有很多RAM,所以我需要将它保存为位。
较大的变量是无符号的32位长,但保存数据不是我的问题,问题是如何访问特定的位位置并将其复制到char(8)变量。
答案 0 :(得分:1)
您可以使用按位运算符:
//bits: your bits (byte array), start: index of the first bit of the char you want
char select(char* bits, int start) {
dec = start%8;
return bits[start/8]>>dec + bits[start/8+1]<<dec;
}
上面的代码假设开始&lt; (bits.size() - 8)
[修改强>] 您可以将char *更改为您想要的任何类型。但是,您需要将dec值更改为适当的位数(8 * SIZE_IN_BYTES)然后应用运算符| (&#34;逻辑或&#34;)让你的char回来
示例:
char select(int* bits, int start) {
nbitsint = 8*4;
dec = start%nbitsint;
if (dec < nbitsint-8) {
// | 0xff creates creates a byte
return (bits[start/nbitsint]>>((3-dec/8)*8+dec%8) | 0xff;
}
// Getting a byte which is astride two values is tricky
return (bits[start/nbitsint]>>(start%8) + bits[start/nbitsint+1]<<(start%8) | 0xff;
}