Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中反转十六进制数的程序_C_Hex_Decimal - Fatal编程技术网

在C语言中反转十六进制数的程序

在C语言中反转十六进制数的程序,c,hex,decimal,C,Hex,Decimal,我的做法: 第一步。首先我把十六进制数转换成十进制数。(十六进制到十进制逻辑) 然后我使用~operator和unsigned char数据类型变量反转十进制数的位 第二步。然后我把十进制数转换成十六进制数。(十进制到十六进制逻辑) 所以我得到了倒十六进制数 输入和输出是十六进制数的字符串 #包括 #包括 #包括 int 主要() { 长十进制,qu,rem; int k,j=0; 六碳[100]; int p=0; 内部挖掘,温度; 无符号字符re=0; 字符十六进制[32]=“42”;//输

我的做法:

第一步。首先我把十六进制数转换成十进制数。(十六进制到十进制逻辑)

然后我使用~operator和unsigned char数据类型变量反转十进制数的位

第二步。然后我把十进制数转换成十六进制数。(十进制到十六进制逻辑)

所以我得到了倒十六进制数

输入和输出是十六进制数的字符串

#包括
#包括
#包括
int
主要()
{
长十进制,qu,rem;
int k,j=0;
六碳[100];
int p=0;
内部挖掘,温度;
无符号字符re=0;
字符十六进制[32]=“42”;//输入
int len=strlen(十六进制);
蓝--;
对于(int i=len;i>=0;i--)
{
开关(十六进制[i])
{
案例“A”:
dig=10;
打破
案例“B”:
dig=11;
打破
案例“C”:
dig=12;
打破
案例“D”:
dig=13;
打破
案例“E”:
dig=14;
打破
案例“F”:
dig=15;
打破
违约:
dig=十六进制[i]-48;
打破
}
温度=温度+挖掘*功率(16,p);
p++;
re=温度;
re=~re;
}
qu=re;
while(qu!=0)
{
rem=qu%16;
如果(rem<10)
hexa[j++]=48+rem;
其他的
hexa[j++]=55+rem;
qu=qu/16;
}
对于(k=j;k>=0;k--)
{
printf(“%c”,十六进制[k]);
}
返回0;
}
#包括
#包括
int main(){
printf(“请输入一些十六进制:”);
无符号整数十六进制;
//将输入扫描为十六进制到整数
扫描频率(“%x”和十六进制);
//将最后一个字节截断为字符
无符号字符c=十六进制;
//倒过来
c=~c;
//以大写十六进制打印出来
printf(“倒十六进制:%02X\n”,c);
返回0;
}

这也许足够了。这对于执行与您描述的相同的步骤非常重要,但代码更少

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

int main()
{
  char * hex = "42ABE3";
  unsigned dec;

  for(int i = 0; i < strlen(hex); i++) {
    sscanf(hex + i, "%1X", &dec);
    printf("%X", 15 - dec);
  }
}

请注意,此代码没有检查sscanf是否成功,但如果需要,您可以添加它。

我们讨论的长度是多少?我是说六边形的弦。它是未知的字节长,必须逐字节倒排,还是像8位一样是固定长度?长度是8位您的问题是什么?例如,如果输入是42,其二进制是0100 0010。所以输出应该是1011101=BD@stark这个问题是由同一个用户提出的,但我很抱歉地说,即使在看到这些评论之后,我也不明白背后的逻辑。因此,请您简单地解释一下逻辑。
scanf
将十六进制输入读取到
hex
变量中,然后
hex
的最后一个字节写入
c
变量中,
c
变量通过
~/code>运算符反转,然后通过
printf
c
打印为十六进制。谢谢您的回答。但是我想要的是,预先定义十六进制的值。并且不想从用户那里扫描它。我正在学习嵌入式系统的编码。例如,无符号整数十六进制=42//42例如,那么您可以去掉scanf并将十六进制设置为0x42。int实际上不需要无符号,但字符必须无符号,否则对于大于0x80的值,它将环绕并显示为负数,这是错误的。感谢您的回答。但我想要的是,预先定义我的输入。并且不想从用户那里扫描它。我正在学习嵌入式系统的编码。@Rohit它没有从用户那里扫描
sscanf
从字符串扫描。您能解释sscanf行吗?与简单的
scanf
相同,但扫描字符串
hex
。使用
hex+i
时,字符串的开头将是从0开始的
i
第个字符索引。因此,如果
i=2
,那么它将从示例中的
A
进行扫描<代码>“%1X”
将以一个十六进制数字读取为十进制。
#include <stdlib.h>
#include <stdio.h>

int main() {
    printf("Please enter some hex: ");
    unsigned int hex;
    // scan input as hex into an integer
    scanf("%x", &hex);
    // truncate the last byte into a char
    unsigned char c = hex;
    // invert it
    c = ~c;
    // print it back out as uppercase hex
    printf("Inverted hex: %02X\n", c);
    return 0;
}
#include <stdio.h>
#include <string.h>

int main()
{
  char * hex = "42ABE3";
  unsigned dec;

  for(int i = 0; i < strlen(hex); i++) {
    sscanf(hex + i, "%1X", &dec);
    printf("%X", 15 - dec);
  }
}
BD541C