我有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位读入变量。
最佳答案
我已经更新了此内容,因为评论者提到它未使用实数。我知道这一点,但重点是要让做作业的人留些东西。
以下内容并不是一个很好的答案,但是它应该使任何有此想法的人都能以一种简洁的方式解决它。在第二种方法中,我将字符串用作要转换的东西,并将其转换为二进制数,然后从那里进行了一些操作。
一切都摆弄整齐,总有办法加快速度,例如,您可以对所有8个字节使用Masks以避免某些移位,也可以展开循环等。
#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;
}
关于c - 抓取C中一个无符号字符的位1和6,以及2至5,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36256021/