Java功底篇系列-03-一些位运算符你会如何理解?

简介:

话题一:异或

先看一段代码吧:


wKiom1XP6JbDX80rAABR6TGTePY135.jpg

这段代码是用来实现a,b交换的。


异或是位运算符,0^1为1,其他情况都是0,这是一个加法不进位的功能!


这有什么用呢?


其实通过上面交换的例子,我们已经明白A^B^A将得到B,也就是可以实现数据还原的功能!



话题二:%与&

如果有一堆数据,我们想将这些数据通过HASH的方式,放入到桶中。


我们可以将桶进行编号,比如0号,1号,...N号桶。


给我们一个数据,我们要完成这个数据和桶的序号的映射转化关系,这样放入和查找就可以了。


由于对于任何一个非负数A,进行A%B,得到的必然是[0,B-1]区间内,所以我们可以利用%的特性来完成这个转化关系!


其实,&也可以完成这一过程!而且&是CPU级别的位运算,会更快些!


要知道A&B,得到的一定是[0,B]区间内,真是神奇!


因为,&其实是一个置0的操作,比如A&B,也就是说将A的二进制中出现0的位置都反映到B对应的位置上,因此A&B是一个变小的过程!


但是,注意到比如B是10,对应二进制是1010,也就是说不论A是什么,A&B得到的二进制的一号位,三号位必然是0【假设从右至左开始】。那么A&B将取不到一些数,比如3,意味着3号桶将始终得不到数据!因此如果选择&,那么B的二进制一定要是连续的1,不能出现0位。



话题三:|

我们知道LINUX文件的权限可以分为rwx,也就是用三个二进制位就可以表达了,下面要求设计程序实现给定一个数字完成权限的判断。


wKioL1XP-siQKTd1AAFPYMskMVA268.jpg


在涉及到大量的判断的时候,我们可以利用& | 这些位操作来达到目标!



话题四:>>>和<<


>>>是无符号的向右移动,也就是左边空缺的补0。

而>> << 都是有符号的移动,空缺时补符号位的。


>>> >> << 这些都是操作二进制序列移动的,可是我们实际开发中用得到吗?


我们知道,在网络上,发送都是字节流,比如发送int a = 32;


一个int占用4个字节,比如从高到低:B1 B2 B3 B4


对于JAVA而言,将按照从高到低的顺序进行发送;那么显然我们必须能够将一个int分解成B1,B2, B3,B4;同时,在接收方必须知道如何将B1 B2 B3 B4组装成原始的数据!


【不同语言可能发送的字节顺序不一样,比如C/C++可能发送的就是从低到高】


看一段程序吧:


wKioL1XQUuDDNToHAAHQmQ84foQ137.jpg


运行结果为:


wKioL1XQUwKw686QAABz614RB3U260.jpg


本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1685021,如需转载请自行联系原作者

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