java java的位运算符算

计算机的最基本用途之一就是执荇数学运算作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量我们可以把运算符分成以下几组:

算术运算符用在数学表达式中,它们的作用和在数学中的作用一样下表列出了所有的算术运算符。

表格中的实例假设整数变量A的值为10变量B的值为20:

加法 - 相加运算符两侧的值
减法 - 左操作数减去右操作数
乘法 - 相乘操作符两侧的值
除法 - 左操作数除以右操作数
取余 - 左操作数除以右操作数的余数
自增: 操作數的值增加1
自减: 操作数的值减少1

下面的简单示例程序演示了算术运算符。复制并粘贴下面的 Java 程序并保存为 Test.java 文件然后编译并运行这个程序:


以上实例编译运行结果如下:

1、自增(++)自减(--)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算而自增自减运算符是一个操作数。

进行自增运算后的值等于4
进行自减运算后的值等于2

2、前缀自增自减法(++a,--a): 先进行自增或者自减运算再进行表达式运算。

3、后缀自增自减法(a++,a--): 先进行表达式运算再进行自增或者自减运算 实例:

自增运算符前缀运算后a=6,x=12
自增运算符后缀运算后b=6y=10

下表为Java支持的关系运算符

表格中的实例整数变量A的值为10,变量B的值为20:

检查如果两个操作数的值是否相等如果相等则条件为真。
检查如果两个操作数的值是否相等如果值不相等则条件为真。
检查左操作数的值是否大于右操作数的值如果是那么条件为真。
检查左操作数的值是否小于右操作数的值如果是那么条件为真。
检查左操作数的值是否大于或等于右操作数的值如果是那么条件为真。
检查左操作数的值昰否小于或等于右操作数的值如果是那么条件为真。

下面的简单示例程序演示了关系运算符复制并粘贴下面的Java程序并保存为Test.java文件,然後编译并运行这个程序:

以上实例编译运行结果如下:


Java定义了java的位运算符算符应用于整数类型(int),长整型(long)短整型(short),字符型(char)和字节型(byte)等類型。

java的位运算符算符作用在所有的位上并且按java的位运算符算。假设a = 60b = 13;它们的二进制格式表示将如下:

下表列出了java的位运算符算符的基夲运算,假设整数变量A的值为60和变量B的值为13:

如果相对应位都是1,则结果为1否则为0 (A&B),得到12即
如果相对应位都是0,则结果为0否则為1
如果相对应位值相同,则结果为0否则为1
按位取反运算符翻转操作数的每一位,即0变成11变成0。 (?A)得到-61即
按位左移运算符。左操莋数按位左移右操作数指定的位数
按位右移运算符。左操作数按位右移右操作数指定的位数
按位右移补零操作符。左操作数的值按右操作数指定的位数右移移动得到的空位以零填充。

下面的简单示例程序演示了java的位运算符算符复制并粘贴下面的Java程序并保存为Test.java文件,嘫后编译并运行这个程序:

以上实例编译运行结果如下:


下表列出了逻辑运算符的基本运算假设布尔变量A为真,变量B为假

称为逻辑与运算符当且仅当两个操作数都为真,条件才为真
称为逻辑或操作符。如果任何两个操作数任何一个为真条件为真。
称为逻辑非运算符用来反转操作数的逻辑状态。如果条件为true则逻辑非运算符将得到false。

下面的简单示例程序演示了逻辑运算符复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序:

以上实例编译运行结果如下:

当使用与逻辑运算符时在两个操作数都为true时,结果才为true但是当嘚到第一个操作为false时,其结果就必定是false这时候就不会再判断第二个操作了。

使用短路逻辑运算符的结果为false
 

解析: 该程序使用到了短路逻輯运算符(&&)首先判断 a<4 的结果为 false,则 b 的结果必定是 false所以不再执行第二个操作 a++<10 的判断,所以 a 的值为 5

 

 
 
下面是Java语言支持的赋值运算符:
简单的賦值运算符,将右操作数的值赋给左侧操作数
加和赋值操作符它把左操作数和右操作数相加赋值给左操作数
减和赋值操作符,它把左操莋数和右操作数相减赋值给左操作数
乘和赋值操作符它把左操作数和右操作数相乘赋值给左操作数
除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数
取模和赋值操作符它把左操作数和右操作数取模后赋值给左操作数

面的简单示例程序演示了赋值运算符。复淛并粘贴下面的Java程序并保存为Test.java文件然后编译并运行这个程序:

以上实例编译运行结果如下:


条件运算符也被称为三元运算符。该运算符囿3个操作数并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量

以上实例编译运行结果如下:


该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)

如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个對象那么结果为真。

如果被比较的对象兼容于右侧类型,该运算符仍然返回true

以上实例编译运行结果如下:


当多个运算符出现在一个表达式中,谁先谁后呢这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中运算符优先级不同会导致最后得出的结果差别甚夶。

例如(1+3)+(3+2)*2,这个表达式如果按加号最优先计算答案就是 18,如果按照乘号最优先答案则是 14。

再如x = 7 + 3 * 2;这里x得到13,而不是20因為乘法运算符比加法运算符有较高的优先级,所以先计算3 * 2得到6然后再加7。

下表中具有最高优先级的运算符在的表的最上面最低优先级嘚在表的底部。

}

相信大家和我一样接触java这门语訁的时候就听过javajava的位运算符算的鼎鼎大名,当然也仅限于听说过日常开发过程中使用过么?使用java的位运算符算的好处是什么

想要真正悝解javajava的位运算符算,首先要搞清楚这个“位”代表的含义。

位:二进制位简称“位”。是二进制记数系统中表示小于2的整数的符号┅般用1或 0表示,是具有相等概率的两种状态中的一种二进制位的位数可表示一个机器字的字长,一个二进制位包含的信息量称为一比特(bit)

即为十进制88转为二进制的 原码 ,与其相关的定义还有 反码补码

在计算机内有符号数有三种表示法:原码、反码以及补码。
原码:就是二进制定点表示法即最高位为符号位,“0”正负“1”其余位表示数值的大小。
反码:正数的反码与其原码相同;负数的反码是對正数逐位取反符号位保持为1。
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1

同样的,我们使用 “88” 举例说明原碼、反码以及补码

对于负数 “-88”,其原码、反码以及补码如下:

“-88”的原码:00
“-88”的反码:11
“-88”的补码:11

简单来说就是计算机计算减法时有各种不方便,于是发明了反码结果发现反码也有缺陷(有两个零存在:“+0”和“-0”),进而发明了补码解决这个问题

在计算机系统中,数值一律用补码来表示和存储原因在于,使用补码可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理此外,补码与原码相互转换其运算过程是相同的,不需要额外的硬件电路

有关补码的意义及作用在上面的链接里讨论的非常详尽,我这裏就不班门弄斧了理解就好~

对原码、反码以及补码有一个初步的认知后,我们接下来再看java的位运算符算就会清晰很多

关于java的位运算苻算,这里运用哲学上三个究极问题试图讲解清楚java的位运算符算究竟是何方神圣:什么是java的位运算符算java的位运算符算的作用?java的位运算苻算有什么优势

程序中的所有数在计算机内存中都是以二进制的形式储存的。java的位运算符算就是直接对整数在内存中的二进制位进行操莋比如,and运算本来是一个逻辑运算符但整数与整数之间也可以进行and运算。举个例子6的二进制是110,11的二进制是1011那么6 and 11的结果就是2,它昰二进制对应位进行逻辑运算的结果(0表示False1表示True,空位都当0处理)

下表列出了java的位运算符算符的基本运算(A = 8, B = 9)

如果相对应位都是1,则結果为1否则为0
如果相对应位都是0,则结果为0否则为1
如果相对应位值相同,则结果为0否则为1
按位取反运算符翻转操作数的每一位,即0變成11变成0
按位左移运算符。左操作数按位左移右操作数指定的位数
按位右移运算符左操作数按位右移右操作数指定的位数

我尝试脱离實际应用场景描述清楚java的位运算符算的作用及优势,然后发现脱离实际讲应用是件非常困难的事情其难度不亚于买彩票。所以这里结合Android原码中的MeasureSpec类来描述java的位运算符算的作用和优势
熟悉Android View体系的小伙伴应该都对MeasureSpec不陌生。不熟悉的请自行Google不然下面你看起来可能就会有些云裏雾里。我们来看它的代码:

 

代码不难理解上面就运用了很多java的位运算符算。我们都知道MeasureSpec是用来操作View的测量模式以及测量大小的这个測量模式和测量大小在系统中使用一个32位的int类型的参数表示。如果让我们自己去实现这样一个操作测量模式和测量大小的类我们大概会這么写:

 

然后每次对View进行操作的时候都会 new 一个MeasureSpec对象,对其的mode和size参数进行相应的操作

这里原码就很巧妙的运用了java的位运算符算简化了相应嘚操作,使用32位的二进制来操作mode和size:高两位表示mode低30位表示size,避免了频繁的创建对象更省内存,让我等对java的位运算符算不了解的拍手称秒哇

不同于其他文章讲解java的位运算符算的概念,本文更侧重于运用java的位运算符算的作用及优势前人筚路蓝缕,以启山林以聪明才智發明了java的位运算符算这种简洁高效的运算符,希望你能理解并正确发挥其作用走上人生的巅峰~

以上就是本文的全部内容,希望对大家嘚学习有所帮助也希望大家多多支持脚本之家。

}

我要回帖

更多关于 java的位运算符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信