Java中~符号运算原理

~属于位运算(与或非中的非运算),其计算原理如下:

首先要先知道什么是源码、补码、反码

计算机在存储int类型数据的时候是固定大小的4字节32位二进制存储形式(最高位代表正负,剩余代代表数字大小,所以int的范围是-2^31 – (2^31 - 1))。例如数字7,其在计算机内部存储的二进制码为:

00000000 00000000 00000000 00000111

这个二进制码被称为源码。顾名思义,反码即源码反转,即:

11111111 11111111 11111111 11111000

而补码的含义对正数、负数的含义不是一样的:
正数的补码是其本身源码
负数的补码转换如下:首先我们需要得到其对应正数源码的反码,然后将反码的位数加一。位数加一的具体例子:
如二进制0010,位数加一变成0011
如二进制0011,位数加一变成0100
如二进制0101,位数加一变成0110
如二进制0111,位数加一变成1000

然后我们来看~到底是怎么计算的。

例如对于数字7,其二进制如上所述。我们需要做的是得到其反码,如上所述,最高位代表正负号:0为正,1为负。然后我们保持最高位不变,将反码再求其反码,即:

10000000 00000000 00000000 00000111

然后剩下的步骤与求补码有些许类似:将上面的二进制进行位数加一,变成:

10000000 00000000 00000000 00001000

这个结果就是~7的答案的二进制代码,即-8
事实上int类型的数字的~运算可以由以下方法计算:

(- i) - 1

i 代表的是任意整数

欢迎批评指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成四元式是编译器前端的一个关键步骤,四元式一般用于表示程序间代码。在 Java ,我们可以使用类来表示四元式,该类包含四个属性,分别表示操作符、操作数1、操作数2和结果。下面是一个简单的示例: ```java public class Quadruple { private String operator; private String operand1; private String operand2; private String result; public Quadruple(String operator, String operand1, String operand2, String result) { this.operator = operator; this.operand1 = operand1; this.operand2 = operand2; this.result = result; } public String getOperator() { return operator; } public String getOperand1() { return operand1; } public String getOperand2() { return operand2; } public String getResult() { return result; } public void setOperator(String operator) { this.operator = operator; } public void setOperand1(String operand1) { this.operand1 = operand1; } public void setOperand2(String operand2) { this.operand2 = operand2; } public void setResult(String result) { this.result = result; } } ``` 在生成四元式的过程,需要维护一个符号表来记录变量和函数的信息,同时需要对源代码进行词法分析和语法分析。在分析源代码并生成四元式的过程,需要使用递归下降算法或其他语法分析算法。 下面是一个简单的示例程序,用于计算两个数的和: ```java import java.util.ArrayList; import java.util.List; public class Main { private static int index = 0; private static List<Quadruple> quadruples; private static String[] tokens; public static void main(String[] args) { String source = "int a = 1; int b = 2; int c = a + b;"; tokens = source.split(" "); quadruples = new ArrayList<>(); parse(); for (Quadruple quadruple : quadruples) { System.out.println(quadruple.getOperator() + " " + quadruple.getOperand1() + " " + quadruple.getOperand2() + " " + quadruple.getResult()); } } private static void parse() { while (index < tokens.length) { String token = tokens[index]; if (token.equals("int")) { index++; String name = tokens[index]; index++; if (tokens[index].equals("=")) { index++; String value = tokens[index]; index++; quadruples.add(new Quadruple("=", value, null, name)); } } else if (token.equals(";")) { index++; } else if (token.equals("+")) { index++; String operand1 = tokens[index]; index++; String operand2 = tokens[index]; index++; String result = "t" + quadruples.size(); quadruples.add(new Quadruple("+", operand1, operand2, result)); } else { index++; } } } } ``` 在这个示例程序,我们使用了一个简单的手写解析器来解析源代码。程序会生成三个四元式,分别表示变量赋值和加法运算

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值