我有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/

10-08 23:03