c - 将十进制转换为十六进制时一次只考虑 4 位
问题描述
我有一个将十进制转换为十六进制字符串的 C 函数hexConversion
:
int hexConversion(int num){
char hex_buffer[9];
unsigned int mask = 4026531840;
for(int i = 0; i < 9; i++){
int temp = mask & num;
if(temp < 10){
hex_buffer[i] = temp + '0';
}
else if(temp == 10){
hex_buffer[i] = 'A';
}
else if(temp == 11){
hex_buffer[i] = 'B';
}
else if(temp == 12){
hex_buffer[i] = 'C';
}
else if(temp == 13){
hex_buffer[i] = 'D';
}
else if(temp == 14){
hex_buffer[i] = 'E';
}
else if(temp == 15){
hex_buffer[i] = 'F';
}
mask >>= 4;
}
hex_buffer[8] = '\0';
for(int i = 0; i < sizeof(hex_buffer); i++){
printf("%c", hex_buffer[i]);
}
}
带驱动代码:
int main(){
hexConversion(2);
hexConversion(255);
hexConversion(-1);
hexConversion(INT_MAX);
hexConversion(INT_MIN);
hexConversion(0xDEADBEEF);
}
我的输出是:
00000002 0000000F 0000000F 0000000F 00000000 0000000F
每个输出的最后一个值都是正确的,但最后一个值之前的所有值都没有计算。我相信这是因为 mytemp = mask & num
没有产生不是 0-15 的值。我的问题是,我如何一次只考虑 4 位,以便我的所有temp
值都在这个范围内?
解决方案
这取决于您的系统,但是如果您想从您的值中提取 nybbles,您最终可以在您的值上应用 0xF (masks >> (4 * n)) 例如,如果我得到一个看起来像这样的二进制数据 0x4602 = 0100 0110 0000 0010
并且我需要提取只有这个的第一部分我可以0xF000 = 1111 0000 0000 0000
在这个 0x4602 上使用带有 & 掩码的 a 来获得这个值的第一部分这会给我们
0xF000 = 1111 0000 0000 0000
&0x4602 = 0100 0110 0000 0010
result would be 0x4000 = 0100 0000 0000 0000
要获得该值的第 n 部分,您可以将 (0xF000) 与 >> 4 n 次
推荐阅读
- amazon-web-services - AWS Lambda ListVersionsByFunction 返回的版本是否已排序?
- r - 按 r 中的列值标记 nmds 图
- rabbitmq - 发现在 RabbitMQ 中等待消息的队列
- node.js - 从 Javascript/Node 获取 Skype 状态
- unit-testing - 使用 jest-express,如何对给定请求调用中间件进行单元测试?
- python - Tensorboard 摘要卡在 0
- c# - 使用可视化 C# 写入另一个程序的另存为对话框
- javascript - 如何检查用户是否在控制台中输入了某些内容?Javascript
- mongodb-query - 使用 mongo shell 查找不同长度的字符串字段
- amazon-web-services - AWS S3 文件夹放置事件通知