【Java】运算符(2)

简介: 【Java】运算符

5.位运算符

位运算符,见名知意 就可以知道是处理二进制位的运算符。


补充知识:


Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位


1 字节 = 8 比特位


位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(二进制:01构成的序列), 按位运算就是在按照 二进制位 的每一位依次进行运算。


位运算符:&        |        ~        ^


&:按位与

| :按位或

~:按位取反

^:按位异或

注:位运算符操作数可以是变量也可以是常量


5.1 按位与 &

&:全一得一,两个比特位都是 1 ,则为 1


public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println(a & b);
        System.out.println(7 & 6);
    }
}

上述代码运行结果:

の.png



代码分析:


a = 10,b = 20,然后 a & b。 首先将 a 和 b 都转换成二进制的形式,因为 a,b 是 int 类型所以转换为 32 位二进制位:


a:00000000 00000000 00000000 00001010


b:00000000 00000000 00000000 00010100


然后进行按位与,全一得一,则结果为:


00000000 00000000 00000000 00000000,结果就为 0

呃.png



7 & 6, 7 和 6 默认都是 int 类型的,首先将 7 和 6 都转换为 32 位二进制位:


7:00000000 00000000 00000000 00000111


6:00000000 00000000 00000000 00000110


然后进行按位与,全一得一,则结果为:


00000000 00000000 00000000 00000110 ,就为 6

(⊙﹏⊙).png



5.2 按位或 |

| :见一得一,两个比特位只要有一个是 1 ,则为 1


public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println(a | b);
        System.out.println(7 | 6);
    }
}

上述代码运行结果:

去.png



代码解析:


a = 10,b = 20,然后 a | b。 首先将 a 和 b 都转换成二进制的形式,因为 a,b 是 int 类型所以转换为 32 位二进制位:


a:00000000 00000000 00000000 00001010


b:00000000 00000000 00000000 00010100


然后进行按位与,见一得一,则结果为:


00000000 00000000 00000000 00011110,结果就为 30


请.png


7 & 6, 7 和 6 默认都是 int 类型的,首先将 7 和 6 都转换为 32 位二进制位:


7:00000000 00000000 00000000 00000111


6:00000000 00000000 00000000 00000110


然后进行按位与,见一得一,则结果为:


00000000 00000000 00000000 00000111 ,就为 7

其.png



5.3 按位取反 ~

~ : 1 变 0 , 0 变1


public class Test {
    public static void main(String[] args) {
        int a = 10;
        System.out.println(~a);
    }
}

上述代码运行结果:

前.png



代码解析:


a = 10,然后 ~a 。 首先将 a  转换成二进制的形式,因为 a 是 int 类型所以转换为 32 位二进制位:


a:00000000 00000000 00000000 00001010


然后按位取反得,1 变 0 , 0 变 1,得:


11111111 11111111 11111111 11110101


计算机只会存储二进制补码的形式,所以计算机会认为这是补码,在用户进行读取的时候计算机会自动将补码转换成原码,然后进行读取出来


补码转原码有两种方法


方法一:补码除了符号位,其他位按位取反,然后加1,的原码

玩.png



方法二:补码减一得反码,反码符号位不变其他位按位取反得原码


额.png


则 ~a 的结果就是 -11


补充知识:


正数的原 反 补相同


负数的反码等于原码符号位不变,然后按位取反;负数的补码就是负数的反码加1


5.4 按位异或 ^

^ :相同为 0,不同为 1


public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println(a ^ b);
    }
}

上述代码运行结果 :


代码解析:


a = 10,b = 20,然后 a ^ b。 首先将 a 和 b 都转换成二进制的形式,因为 a,b 是 int 类型所以转换为 32 位二进制位:


a:00000000 00000000 00000000 00001010


b:00000000 00000000 00000000 00010100


然后进行按位异或,相同为 0,不同为 1 则结果为:


00000000 00000000 00000000 00011110,结果就为 30

为.png



6.移位运算

移位运算符,见名知意 肯定又是对二进制位的运算


移位运算符:<<         >>         >>>


<<:左移

>>:右移

>>>:无符号右移

6.1 左移  <<

<< :最左侧位不要了, 最右侧补 0


public class Test {
    public static void main(String[] args) {
        int a = 10;
        System.out.println(a << 1);
    }
}

上述代码运行结果:


五.png


代码解析:


a = 10,然后 a << 1 。 首先将 a  转换成二进制的形式,因为 a 是 int 类型所以转换为 32 位二进制位:


a:00000000 00000000 00000000 00001010


然后最左侧位不要了, 最右侧补 0


00000000 00000000 00000000 00010100


将二进制位转换为十进制就是 20

の.png



注:


向左移位时,丢弃的是符号位,因此正数左移可能会变成负数

左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.

5.2 右移 >>

>>:最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)


public class Test {
    public static void main(String[] args) {
        int a = 10;
        System.out.println(a >> 1);
    }
}

上述代码运行结果:

饿.png



代码解析:


a = 10,然后 a >> 1 。 首先将  a  转换成二进制的形式,因为 a 是 int 类型所以转换为 32 位二进制位:


a:00000000 00000000 00000000 00001010


然后最右边侧位不要了, 左边正数补0, 负数补1


00000000 00000000 00000000 00001010


将二进制位转换为十进制就是 20

啊.png



注:右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.


5.3 无符号右移 >>>

>>>:最右侧位不要了, 最左侧补 0


public class Test {
    public static void main(String[] args) {
        int a = -10;
        System.out.println(a >>> 1);
    }
}

上述代码运行结果:  


阿.png


代码解析:


a = -10,然后 a >>> 1 。 首先将  a  转换成二进制的形式,因为 a 是 int 类型所以转换为 32 位二进制位:


a:10000000 00000000 00000000 00001010


如果是负数,则需要转为补码然后存储在计算机内进行运算


原码:10000000 00000000 00000000 00001010


反码:11111111 11111111 11111111 11110101


补码:11111111 11111111 11111111 11110110


然后无符号左移: 01111111 11111111 11111111 11111011


结果就为:2147483643



吖.png

6.条件运算符

条件运算符只要一个:?:


条件运算符的格式:表达式1 ? 表达式2 : 表达式3


表达式1 的结果必须是 boolean 类型


当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.


条件运算符也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.


public class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int c = (a > b) ? a : b;
        System.out.println(c);
    }
}

上述代码运行结果:

嗄.png



代码解析:


如果 a > b 为 true ,则把 a 的值赋值给 c,如果 a > b 为 false ,则把 b 的值赋值给 c  


相关文章
|
2月前
|
Java Go 开发工具
【Java】(4)五种运算符的说明(&&、||、>=、>、<=、<)、4种控制语句(if、for、while、dowhile)、输入和输出说明
扩展类的赋值运算符不改变运算结果类型,假设最初这个变量的的类型byte类型,无论怎么进行加或追减,最终该变量的数据类型还是byte类型。注:一个表达式中有多个运算符,运算符有优先级,不确定的加小括号,优先级得到提升。当布尔表达式的结果是false的时候,选择表达式2作为整个表达式的执行结果。当布尔表达式的结果是true的时候,选择表达式1作为整个表达式的执行结果。当用户输入的时候,并且最终敲回车键的时候,键入的信息会自动赋值给a。并且,连接运算之后的结果还是一个字符串类型。表达式1 : 表达式2。
155 1
|
9月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
194 13
|
4月前
|
存储 缓存 算法
Java数据类型与运算符深度解析
本文深入解析Java中容易混淆的基础知识,包括八大基本数据类型(如int、Integer)、自动装箱与拆箱机制,以及运算符(如&与&&)的使用区别。通过代码示例剖析内存布局、取值范围及常见陷阱,帮助开发者写出更高效、健壮的代码,并附有面试高频问题解析,夯实基础。
|
6月前
|
人工智能 Java
Java运算符中的隐式转换
本文介绍了 Java 运算符中的隐式类型转换规则,涵盖算数、逻辑、位、关系、赋值及其他运算符。重点分析了算数和位运算符在处理小于 int 位长的数据时会自动转换为 int 类型的特性,并通过代码示例说明可能引发的类型不匹配错误。逻辑、关系、赋值及其他运算符则不涉及类型转换。总结指出,部分运算符在计算时会将小位长数据隐式转为 int 类型,结果也为 int。
|
6月前
|
人工智能 Rust Java
Java中的算数、关系、逻辑、条件、赋值 五大运算符详解
本文介绍了Java中的运算符及其优先级,包括算数运算符(如+、-、*、/、%、++、--)、关系运算符(如&lt;、&gt;、==、!=)、逻辑运算符(如&&、||、!)、条件运算符(三目运算符)和赋值运算符(如=、+=、-=等)。详细解释了每种运算符的功能与用法,例如自增自减运算符的特点、逻辑运算符的短路法运算以及位运算符的操作规则。最后还提供了运算符优先级表格,帮助开发者理解复杂表达式的计算顺序。文中提醒,在实际开发中,建议使用括号明确运算顺序以提高代码可读性。
323 0
|
Java
Java运算符
Java运算符
119 12
|
9月前
|
Java
课时15:Java运算符(基础数学运算符)
课时15介绍了Java中的基础数学运算符,涵盖加、减、乘、除及自增自减运算。强调了运算符的优先级和使用括号的重要性,并通过范例展示了四则运算与自增自减的具体应用。提醒编写代码时应保持简洁,避免复杂的表达式,确保代码易读性和可维护性。
151 7
|
9月前
|
SQL IDE 算法
《从头开始学java,一天一个知识点》之:运算符与表达式:算术、比较和逻辑运算
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列为你打造Java「速效救心丸」,每天1分钟,地铁通勤、午休间隙即可完成学习。直击高频考点和实际开发中的「坑位」,拒绝冗长概念,每篇都有可运行的代码示例。明日预告:《控制流程:if-else条件语句实战》。
225 6
|
9月前
|
Java
课时17:Java运算符(关系运算符)
范例:进行关系判断。如果要进行关系运算的操作可使用:>、<、>=、<=、!=(不等于)、==。所有的关系运算符判断完成的数据返回结果都是布尔类型(boolean)。只要使用关系运算符进行逻辑判断,最终的结果就是布尔型,只有true和false两种结果,而且能和if语句结合使用。
185 6
|
9月前
|
Java
课时16:Java运算符(三目运算符)
范例:将两个变量值在大的内容赋值给新变量。三目是一种赋值运算,它指的是根据条件来进行判断。(根据判断的结果来决定赋值内容)对于三目运算的基本使用语法如下: 数据类型 变量 = 布尔表达式 ?条件满足时赋值内容:条件不满足时:赋值内容
197 6