我有一个6字节长的无符号字符。在char中存储的值是:
Hex: 53167DFD95B7
Binary: 010100 110001 011001 111101 111111 011001 010110 110111我需要做的是捕获位1和位6,然后将其转换为十进制。然后捕获位2-5并将其转换为十进制,例如,这里的1位是0,6位是0,所以二进制00是小数0。然后对位2-5,二进制1010或十进制10,然后移动到下一组6位.
1位是1,6位是1,所以二进制11,或十进制3位2-5是二进制1000,或十进制8。
位1是0,位6是1,所以二进制01,或十进制1位2-5是二进制1100,或十进制12。
其他的6位组也是如此。
我不太确定我该怎么掩饰这件事。因为一次只有6位,所以我遇到了一些困难。任何帮助,这将是非常感谢!先谢谢大家。
编辑
int getBitVal(unsigned char *keyStrBin, int keyIndex) {
int keyMod = keyIndex % 8;
int keyIn = keyIndex / 8;
return (((keyStrBin[keyIn]) >> (7 - (keyMod))) & 1);
}
void getSValueMajor(char **tableS, unsigned char *f, unsigned char *sValue) {
int i, bitOne, bitSix;
int sCol;
for (i = 0; i < 8; i++) {
bitOne = getBitVal(f, 0);
bitSix = getBitVal(f, 5);
// Do something here to get only bits 2-5. Doesn't matter if its decimal. Just need the 4 bits.
}
}我猜在循环结束时,我会将6位移到下一个6位,但不知道如何将这4位读到变量中。
发布于 2016-03-28 06:50:02
我更新这一点是因为一位评论者提到它没有使用实数。我知道这一点,但重点是把事情留给做家庭作业的人。
以下并不是一个简洁的答案,但它应该给任何来到这个问题的人一个想法,如何解决它的一个整洁的方式。在第二种方法中,我使用了一个字符串作为我要转换的东西,并将它转换成一个二进制数,并在那里执行了一些位操作。
随着一切在比特摆弄,总是有办法加快速度,你可以使用掩码的所有8个字节,以避免一些转移,你也可以展开循环等。
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
010100 == 00 , 1010 === 0 , 10
110001 == 11 , 1000 === 3 , 8
011001 == 10 , 1100 === 2 , 12
111101 == 11 , 1110 === 3 , 14
111111 == 11 , 1111 === 3 , 15
011001 == 01 , 1100 === 1 , 12
010110 == 00 , 1011 === 0 , 11
110111 == 11 , 1011 === 3 , 11
*/
int main(void) {
size_t x = 48;
size_t v = 91356068156855;
size_t one66 = 0;
size_t two55 = 0;
size_t bit1 = 0;
size_t bit6 = 0;
//Masks
size_t sixty3 = 63;
size_t thirty = 30;
size_t b[8];
b[0] = (v & (sixty3 << 42ULL)) >> 42ULL;
b[1] = (v & (sixty3 << 36ULL)) >> 36ULL;
b[2] = (v & (sixty3 << 30ULL)) >> 30ULL;
b[3] = (v & (sixty3 << 24ULL)) >> 24ULL;
b[4] = (v & (sixty3 << 18ULL)) >> 18ULL;
b[5] = (v & (sixty3 << 12ULL)) >> 12ULL;
b[6] = (v & (sixty3 << 6ULL)) >> 6ULL;
b[7] = (v & (sixty3 << 0ULL)) >> 0ULL;
for(x = 0; x < 8;x++) {
one66 = 0;
two55 = 0;
bit1 = (b[x] & 1) > 0;
bit6 = (b[x] & 32) > 0;
one66 |= bit1 << 1;
one66 |= bit6 << 0;
two55 = (b[x] & thirty) >> 1;
printf("%zu %zu\n", one66, two55);
}
// Method 2 using a string as the input...
// | | | | | | | |
char pat[] = "010100110001011001111101111111011001010110110111";
size_t patlength = strlen(pat);
for(x = 0; x < patlength; x += 6) {
size_t one6 = 0;
size_t two5 = 0;
if(pat[x] == '1') {
one6 |= 1ULL << 0;
}
if(pat[x + 5] == '1') {
one6 |= 1ULL << 1;
}
assert(one6 < 4);
if(pat[x + 1] == '1') {
two5 |= 1ULL << 3;
}
if(pat[x + 2] == '1') {
two5 |= 1ULL << 2;
}
if(pat[x + 3] == '1') {
two5 |= 1ULL << 1;
}
if(pat[x + 4] == '1') {
two5 |= 1ULL << 0;
}
assert(two5 < 16);
printf("%zu %zu\n", one6, two5);
}
return 0;
}https://stackoverflow.com/questions/36256021
复制相似问题