在C中的无符号字符中获取第1位和第6位,以及第2位到第5位

在C中的无符号字符中获取第1位和第6位,以及第2位到第5位,c,algorithm,bit-manipulation,bit-shift,unsigned-char,C,Algorithm,Bit Manipulation,Bit Shift,Unsigned Char,我有一个6字节长的无符号字符。 存储在字符中的值为: 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为二进

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

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(无符号字符*keyStrBin,int-keyIndex){
int keyMod=keyIndex%8;
int-keyIn=keyIndex/8;
返回(((keyStrBin[keyIn])>>(7-(keyMod))&1);
}
void getSValueMajor(字符**表,无符号字符*f,无符号字符*s值){
整数i,比特1,比特6;
int sCol;
对于(i=0;i<8;i++){
bitOne=getBitVal(f,0);
bitSix=getBitVal(f,5);
//在这里做一些事情,只得到2-5位。不管它是十进制的。只需要4位。
}
}

我想在循环结束时将移位6位,然后再移到下一个6位,但不确定如何将这4位读入变量。

我更新了这一点,因为有评论员提到它没有使用实数。我知道这一点,但重点是让做家庭作业的人自己决定

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

随着一切都变得有点混乱,总有一些方法可以加快速度,比如你可以对所有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;
}
#包括
#包括
#包括
#包括
#包括
/*
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
*/
内部主(空){
尺寸x=48;
尺寸v=91356068156855;
尺寸=0;
尺寸t two55=0;
大小\u t位1=0;
尺寸为6位=0;
//面具
尺寸_t六十三=63;
尺寸_t30=30;
尺寸b[8];
b[0]=(v&(sixty3>42ULL;
b[1]=(v&(sixty3>36ULL;
b[2]=(v&(sixty3)>30ULL;
b[3]=(v&(sixty3>24ULL;
b[4]=(v&(sixty3>18ULL;
b[5]=(v&(sixty3>12ULL;
b[6]=(v&(sixty3>6ULL;
b[7]=(v&(sixty3>0ULL;
对于(x=0;x<8;x++){
one66=0;
two55=0;
比特1=(b[x]&1)>0;
比特6=(b[x]&32)>0;
one66 |=位1;
printf(“%zu%zu\n”,一个66,两个55);
}
//方法2使用字符串作为输入。。。
//                    |     |     |     |     |     |     |     |      
字符pat[]=“0101001100010110011111111110110010101101111”;
尺寸(patlength)=strlen(pat);
对于(x=0;xone6 |=1所有相关:这有DES算法的香味。的确。这是一个学校项目。如果你熟悉位操作,你应该自己尝试。首先,尝试前3个字节(前4组6位数字),然后你可以想出一个循环来完成其余的工作。你可以通过采取一些行动来帮自己一个大忙,然后回来描述你所做的事情。许多用户来到这个网站不是寻求帮助,而是寻求有人为他们做工作;向那些自愿花时间在这里帮助他们的人展示你的努力是非常令人鼓舞的。:)我相信输入不是0和1组成的字符串。如果要将字节转换成这样的字符串,将需要太多的计算工作。@HenryLee我已经更新了答案,可以在实数上进行转换。
#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;
}