关于十六进制转二进制数组算法的移位逻辑疑问
十六进制字符转二进制数组算法解析
这个函数可以将十六进制字符数组转换为二进制数组并保持正确顺序,例如输入F1会输出1111 0001。对应的代码如下:
int hex_to_bin(char hex) { if (hex >= '0' && hex <= '9') { return hex - '0'; } else if (hex >= 'a' && hex <= 'f') { return hex - 'a' + 10; } else if (hex >= 'A' && hex <= 'F') { return hex - 'A' + 10; } else { printf("Invalid hexadecimal character: %c\n", hex); exit(1); } } void hex_to_bin_array(char* hex_values, int gpio_count, int* bin_array) { printf("Binary values: "); for (int i = 0; i < gpio_count; ++i) { // Calculate the binary value from the hexadecimal input int gpio_value = hex_to_bin(hex_values[i / 4]) >> (3 - i % 4) & 1; bin_array[i] = gpio_value; printf("%d", gpio_value); if ((i + 1) % 4 == 0) { printf(" "); } } printf("\n"); }
算法逻辑拆解与错误纠正
你对移位值的计算存在错误,当i ∈ [0,4)(即i=0、1、2、3)时,3 - i%4的结果并不是1,0,1,0,正确的计算过程如下:
- 当i=0时:
i%4 = 0,3 - 0 = 3,移位值为3 - 当i=1时:
i%4 = 1,3 - 1 = 2,移位值为2 - 当i=2时:
i%4 = 2,3 - 2 = 1,移位值为1 - 当i=3时:
i%4 = 3,3 - 3 = 0,移位值为0
整个算法的核心逻辑可以拆分为3步:
- 定位十六进制字符:
hex_values[i / 4],因为1个十六进制字符对应4位二进制,所以每4个循环迭代对应同一个十六进制字符(i从0-3取第1个字符,i从4-7取第2个字符,以此类推)。 - 十六进制转十进制数值:
hex_to_bin函数将单个十六进制字符转为0-15的整数(比如'F'转为15,二进制为1111;'1'转为1,二进制为0001)。 - 逐位提取二进制值:
>> (3 - i%4) & 1的作用是从高位到低位提取当前十六进制字符的二进制位:- 右移
3 - i%4位:把目标二进制位移到最低位 - 与
1按位与:取出最低位的数值(0或1)
- 右移
以输入F1、gpio_count=8为例,实际执行过程:
- i=0~3:处理字符'F'(转为15,二进制
1111),依次提取高位到低位的1、1、1、1 - i=4~7:处理字符'1'(转为1,二进制
0001),依次提取高位到低位的0、0、0、1
最终输出1111 0001,符合预期。
内容的提问来源于stack exchange,提问作者void_brain
相关产品推荐
相关产品推荐

