首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中无符号字符中抓取第1和第6位以及第2至第5位

在C中无符号字符中抓取第1和第6位以及第2至第5位
EN

Stack Overflow用户
提问于 2016-03-28 04:33:28
回答 1查看 178关注 0票数 0

我有一个6字节长的无符号字符。在char中存储的值是:

代码语言:javascript
复制
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位,所以我遇到了一些困难。任何帮助,这将是非常感谢!先谢谢大家。

编辑

代码语言:javascript
复制
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位读到变量中。

EN

回答 1

Stack Overflow用户

发布于 2016-03-28 06:50:02

我更新这一点是因为一位评论者提到它没有使用实数。我知道这一点,但重点是把事情留给做家庭作业的人。

以下并不是一个简洁的答案,但它应该给任何来到这个问题的人一个想法,如何解决它的一个整洁的方式。在第二种方法中,我使用了一个字符串作为我要转换的东西,并将它转换成一个二进制数,并在那里执行了一些位操作。

随着一切在比特摆弄,总是有办法加快速度,你可以使用掩码的所有8个字节,以避免一些转移,你也可以展开循环等。

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36256021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档