如何在c语言中实现位的串联和移位?

如何在c语言中实现位的串联和移位?,c,type-conversion,bit-manipulation,C,Type Conversion,Bit Manipulation,我想左筛选1位,并将位连接到uint8\u t指针I,即: (i=0;i0行为是灾难性的我还将删除100size说明符和sizesizeof(十六进制)与硬编码相比,3@chqrlie的计数完全符合size>0检查-答案更新。关于100和3,我认为OP用例是数组大于包含有效数据的实际元素数。因此sizeof(十六进制)存在差异和要移位的元素数。顺便说一句-代码的重要部分在shift\u uint8\u array\u left中,而main中的代码只是说明如何调用函数以及结果是什么。 01810

我想左筛选1位,并将位连接到
uint8\u t
指针I,即:

(i=0;i
hex[i]=(hex[i]在C语言中,没有运算符可以在整个数组上执行左位移位

因此,您必须实现一个可以实现此功能的函数。这可以通过在处理从下一个元素到当前元素的进位时移动数组的各个元素来实现

类似下面的代码:

#include <stdio.h>
#include <inttypes.h>

void shift_uint8_array_left(uint8_t *hex, size_t size)
{
    size_t i; 
    if (size == 0) return;
    for(i=0; i < size-1; i++) 
    {
        size_t carry = (hex[i+1] & 0x80) ? 1 : 0; // Calculate carry
        hex[i] = hex[i] << 1;                     // Shift current element
        hex[i] = hex[i] | carry;                  // Add the carry
    }
    hex[i] = hex[i] << 1;                         // Last element never has a carry
}

#define NUM_UINT8_to_SHIFT 3

int main(void) 
{
    uint8_t hex[100] = {0x1, 0x81, 0x4};

    for (size_t i=0; i<NUM_UINT8_to_SHIFT; ++i) printf("%02X", hex[i]);
    printf("\n");

    shift_uint8_array_left(hex, NUM_UINT8_to_SHIFT);

    for (size_t i=0; i<NUM_UINT8_to_SHIFT; ++i) printf("%02X", hex[i]);
    printf("\n");

    return 0;
}

通过以下方式实施我的计划,我得到了预期的结果:

#include <stdio.h>
#include <string.h>
#include<stdint.h>
#include <stdlib.h>

uint8_t *fun_string2hex(char *str,uint8_t *hex){

  int i=0,j=0;
  memset(hex,0,sizeof(hex));
   /*converting str character into Hex and adding into strH*/
    for(i=0,j=0;i<strlen(str);i++,j+=2)
    { 
        sprintf((char*)hex+j,"%02X",str[i]);
    }
    hex[j]='\0';
    return hex;
}

int main(int argc, char **argv) {

  if(argc<2){
     printf("Usage: %s <Input_string>\n", argv[0]);
        return -1;
  }
     int i=0;
     int count1=0,count2=0;
     uint8_t str_len=0x0;
     str_len=strlen(argv[1]);

     unsigned char str[str_len];
     uint8_t hex[str_len*2];
     uint8_t hex_org[str_len];
     uint8_t convert1_char2hex=0x0,convert2_char2hex=0x0,hex_concatination=0x0;
     for(i=0;i<str_len;i++){
       str[i]=argv[1][i];
     }
     str[i]='\0';
     fun_string2hex(str,hex);

     for(i=0;i<str_len;i++){
    count2=(2*((i+1)-1))+1;
    count1=2*((i+1)-1);
    convert1_char2hex=hex[count1];
    convert1_char2hex=(strtol(&convert1_char2hex, NULL, 16)<<4);
    convert2_char2hex=hex[count2];
    convert2_char2hex=strtol(&convert2_char2hex, NULL, 16);
    hex_concatination=((convert1_char2hex)|(convert2_char2hex));
    hex_org[i]=hex_concatination;
     }
     for(int i=0;i<str_len;i++)
    printf("%0x",hex_org[i]);
     printf("\n");
    return 0;
}   
#包括
#包括
#包括
#包括
uint8\u t*fun\u string2hex(字符*str,uint8\u t*hex){
int i=0,j=0;
memset(十六进制,0,sizeof(十六进制));
/*将str字符转换为十六进制并添加到strH中*/

对于(i=0,j=0;我希望实现以下伪代码:-实现你的梦想…十六进制变量应该是str变量的两倍大-尝试向str变量输入超过50个字符,你会注意到hex
hex[j]处的缓冲区溢出='\0';
在这里不需要,因为您正在使用
memset(…)将缓冲区设置为值“0”
function十六进制是uint8\u t类型,因此它可以存储8位。请提交我们可以验证的最小完整程序,指出您的问题所在,我们可能会帮助您。我希望实现以下伪代码:这不是您想问的问题,因此
shift\u uint8\u array\u left
应该测试
size>0
行为是灾难性的我还将删除
100
size说明符和size
sizeof(十六进制)
与硬编码相比,
3
@chqrlie的计数完全符合
size>0
检查-答案更新。关于100和3,我认为OP用例是数组大于包含有效数据的实际元素数。因此
sizeof(十六进制)存在差异
和要移位的元素数。顺便说一句-代码的重要部分在
shift\u uint8\u array\u left
中,而
main
中的代码只是说明如何调用函数以及结果是什么。
018104
030208
#include <stdio.h>
#include <string.h>
#include<stdint.h>
#include <stdlib.h>

uint8_t *fun_string2hex(char *str,uint8_t *hex){

  int i=0,j=0;
  memset(hex,0,sizeof(hex));
   /*converting str character into Hex and adding into strH*/
    for(i=0,j=0;i<strlen(str);i++,j+=2)
    { 
        sprintf((char*)hex+j,"%02X",str[i]);
    }
    hex[j]='\0';
    return hex;
}

int main(int argc, char **argv) {

  if(argc<2){
     printf("Usage: %s <Input_string>\n", argv[0]);
        return -1;
  }
     int i=0;
     int count1=0,count2=0;
     uint8_t str_len=0x0;
     str_len=strlen(argv[1]);

     unsigned char str[str_len];
     uint8_t hex[str_len*2];
     uint8_t hex_org[str_len];
     uint8_t convert1_char2hex=0x0,convert2_char2hex=0x0,hex_concatination=0x0;
     for(i=0;i<str_len;i++){
       str[i]=argv[1][i];
     }
     str[i]='\0';
     fun_string2hex(str,hex);

     for(i=0;i<str_len;i++){
    count2=(2*((i+1)-1))+1;
    count1=2*((i+1)-1);
    convert1_char2hex=hex[count1];
    convert1_char2hex=(strtol(&convert1_char2hex, NULL, 16)<<4);
    convert2_char2hex=hex[count2];
    convert2_char2hex=strtol(&convert2_char2hex, NULL, 16);
    hex_concatination=((convert1_char2hex)|(convert2_char2hex));
    hex_org[i]=hex_concatination;
     }
     for(int i=0;i<str_len;i++)
    printf("%0x",hex_org[i]);
     printf("\n");
    return 0;
}