Java 使用十六进制/十进制数字进行计算

Java 使用十六进制/十进制数字进行计算,java,Java,我有一个非常简单的方法naf public int naf(int NN, int AA, int FF, int Q) { int mike = FF + 0x20 * AA + 0x200 * NN; if (Q == 1) { mike += 0x4000; } return mike; } 我可以理解这个方法接受4个整数并返回一个整数。在第二行,计算有点混乱。我觉得0x部分与十六进制数字格式有关,但输入参数是十进制的。我还觉得0x可能

我有一个非常简单的方法
naf

public int naf(int NN, int AA, int FF, int Q) {

    int mike = FF + 0x20 * AA + 0x200 * NN;

    if (Q == 1) {
        mike += 0x4000;
    }
    return mike;
}
我可以理解这个方法接受4个整数并返回一个整数。在第二行,计算有点混乱。我觉得
0x
部分与十六进制数字格式有关,但输入参数是十进制的。我还觉得
0x
可能使这些计算可行,但我不确定


当输入为十进制时,
0x
提供了什么?该方法如何进行十六进制计算?

没有十六进制计算。
您有一个整数表达式,它只是其中的一个
两个数字以十六进制格式表示

这个

int mike=FF+0x20*AA+0x200*NN

同:

int-mike=FF+2*16*AA+2*16*16*NN

这与:


int-mike=FF+32*AA+512*NN

java中的整数文字可以是十进制(例如
32
)、十六进制(例如
0x20
)和八进制(例如
040
)的形式。区别在于十进制:无前缀,十六进制:前缀
0x
和八进制:前缀
0

因此,

int mike = FF + 0x20 * AA + 0x200 * NN;
真的只是

int mike = FF + 32 * AA + 512 * NN;
哦,
FF
也是“十六进制形式”的事实一点也不重要,它只是一个方法参数,也可以称为
steven
…-)


干杯,

对于一台计算机来说,数字是如何呈现给你的并不重要,无论是十进制(我们自然熟悉的以10为基数)、十六进制(以16为基数)、八进制(以8为基数)、二进制(以2为基数),你都可以说出来(尽管在Java中,只有八进制、十进制和十六进制是现成的)。在内部,它们都存储为二进制数,即一系列的0和1

在您的代码中,您可以自由选择最适合的格式。默认情况下,Java编译器假定您正在向它输入十进制数,但通过在数字前加0x或仅加0,您会告诉它分别将其解释为十六进制数或八进制数


我建议您尝试阅读数字系统。

十进制或十六进制仅适用于表示文字,例如:

int a = 0xfa; // hexadecimal notation for literal on the right hand side
int b = 251; // decimal notation for the literal on the right hand side
一旦将值存储在变量中,系统就不关心您是否使用十进制或十六进制表示法来表示存储的值:

int c = a + b; // numbers are added, regardless of you they were expressed above

十六进制和十进制只是表示一个数字的两种方式,它不会改变实际的计算。我的好伙计,它最终都是二进制的。
0x
只是一种写十六进制数的方式
0xa
10
是同一个数字,可以对这两个数字进行相同的计算。如果我没有弄错(从我在其他语言中的记忆来看),这个“0x”只是表示您输入的数字的基数。“0x20”的意思是“以16为基数的20”,这等于以10为基数的32。我的观点正好相反——没有十进制计算,因为所有计算机计算都是以二进制进行的。十六进制和十进制只是向用户表示这些数字的方式。@Trenin我在任何地方都没有提到十进制计算。我写了“整数计算”,后来改为“整数表达式”。非常感谢你的回答!如果我想打印出c,输出会是什么?如果我得到正确的System.out.println(“c=“+c”);应该给你502,也就是251+251,也就是251+0xfa。十六进制表示法中的0xfa与十进制表示法中的251相同。哦,对不起,0xfa实际上是250,所以c将是501,或者251+250,或者251+0xfa。我的头脑中并不总是正确地进行转换。