1. java中按位异或是什么意思 不太理解,请指教,谢谢!
异或运算没有听过,不过位与运算就有,它的原理是:先把十进制(或N进制)转换成二进制,再分别同位进行与运算,比如:
12&5(java中位与运算是用&符号表示的)
即:12
=
11000
&
5
=
01001
--------------------
=
11001
位异或运算或许是把它们进行异或吧。
PS楼下不能这么说,有些算法还得用到这些位操作,用得妙的还真叫人拍案叫绝
2. java中^是什么意思
Java中的位运算符!用来做按位异或运算的。异或指的是相同位值相同异或结果为0,相同位异或值不同结果为1。
例如:int
i
=
2^3;
首先需要将数字转换成二进制数,然后进行运算。2的二进制数是10
3是11
10
11
^
-----------
01
所以,i中的结果是数字1。
3. JAVA按位异或运算问题
首先取反运算符优先级高于异或运算符
其次int是32位
28=00011100(前面16位不写了)
8=00001000
-8=11111000
-28=11100100
所以a=28^-8=00011100^11111000=11100100=-28
a=-28^8=11100100^00001000=11101100=-20
是-20,不是20。楼主看清楚了。
4. java运算中&是什么意思,比如a=1;b=2;a&b=多少
&是位操作符,“按位与”;1转成二进制 01;2转成二进制 10;a&b=00转成十进制为0。
位运算符有:&(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。优先级从高到低,依次为~、&、^、|。
按位与运算有两种典型用法,一是取一个位串信息的某几位,如以下代码截取x的最低7位:x & 0177。二是让某变量保留某几位,其余位置0,如以下代码让x只保留最低6位:x = x & 077。
Java 的表达式就是用运算符连接起来的符合Java 规则的式子,运算符的优先级决定了表达式中运算执行的先后顺序。
(4)java按位异或扩展阅读:
整数算术运算的异常是由于除零或按零取模造成的。它将引发一个算术异常。下溢产生零,上溢导致越界。例如:加1超过整数最大值,取模后,变成最小值。
一个op=赋值运算符,和上表中的各双目整数运算符联用,构成一个表达式。整数关系运算符<,>,<=,>=,==和!=产生boolean类型的数据。
5. JAVA 中的 -> 是什么意思
本文主要是讲解 Java 中的运算符。对于运算符而言是编程参与计算的基础核心内容。最基础的加减乘除取余。到后面的逻辑运算大于小于等于不等于。
本文内容思维导图
先从最简单的算术运算符说起。
算术运算符
算术运算符又分为: 一元运算符和二元运算符, 并且在 Java 中包含三元运算符, 就是条件运算符或者叫作三目运算符只是名字不同,含义相同。
一元运算符
一元运算符只有一个变量就可以进行操作。常用的一元运算符就是自加,自减。一共四个一元运算符。
示例代码, 这里使用 JShell 快速查看结果。
需要注意其中的自加和自减的规则。当运算符在前的时候 ++ a; 运算符的优先级比较高, 所以会先处理这个代码, 所以可以看到代码里面直接返回了结果 4。但是 a ++ 的时候却没有直接返回结果, 因为他的运算符比价低。 所以重新调用该变量就会打印出来当前的值。
代码定义如下:
运行查看结果:
二元运算符
二元运算符一共5个。分辨是加减乘除取余(+、-、*、/、%)。
其中,在进行除法运算的时候,遵守除数不能为 0;
如果除数为 0 就会报错, 错误如下:
代码示例如下:
运行查看结果,编译, 运行:
赋值运算符
对于赋值运算符基本上贯穿了整个类的周期。常用的 = 赋值。 和简写赋值和算术运算符的使用方式。赋值运算符有如下图所示的使用方式。
使用 JShell 进行测试代码如下:
代码示例如下:
inta=0;
a=3;
System.out.println(a);// 3
a+=3;
System.out.println(a);// 6
a-=3;
System.out.println(a);// 3
a*=3;
System.out.println(a);// 9
a/=3;
System.out.println(a);// 3
a%=2;
System.out.println(a);// 1
比较运算符
比较运算符, 也可以说是布尔运算符。 主要是比较两个表达式的结果。 (表达式) 操作符 (表达式)
根据上面的运算符进行案例演示, 一定要动手练习。 更能加深印象。
只要知道比较运算是最终得到一个布尔类型的值。并且在进行比较运算的时候, 一定要注意其优先级。代码这次自己动手做吧。 有上面的演示, 应该很容易就搞定。
逻辑运算符
对于逻辑运算符, 主要就是 3 个。 逻辑与、逻辑或、逻辑非。和数学中的与或非意思一致。
格式: 表达式1 逻辑运算符 表达式2
逻辑运算符大多数情况下会和其他的运算符一起使用, 主要做一些简单或复杂的逻辑运算。 并且通常都是和 if, for 等逻辑表达式一起使用。
简单的说一说, 对于逻辑与和逻辑或不同点。 逻辑与为第一个表达式和第二个表达式都等于真值的情况下才会表达式成立。 逻辑或是第一个表达式为真值的情况下, 就不会在执行第二个表达式。 因为不管第二个表达式是否成立, 该逻辑运算都是真值了。
位运算符
对于任何编程语言而言, 最终的操作都是二进制表示, 因为计算机只认识二进制, 而八进制,十进制或者十六进制都是为了让开发人员方便开发。对于 Java 来说, 也可以针对数的某个值进行运算。这就需要位运算符的参与了。也是为了方便对二进制进行操作。
位运算符主要有一下运算符:
位与 &
按位与和逻辑运算符的逻辑与很类似,一个比较的表达式, 一个是按照位来进行判断。在二进制中, 位与的判断为都为 1 的记做 1 否则记做 0。
按位与规则如下:
0 & 0 = 0;
0 & 1 = 0;
1 & 0 = 0;
1 & 1 = 1;
先看一个都是正整数的值 10 & 2。
最终得出结果 0000 1010 & 0000 0010 = 0000 0010 转换成十进制就是2。
对于负值的位与运算有点区别的地方就是参与运算的是补码。
举例说明: 10 & -2
具体如何得到补码, 可以参考我之前写的文章基础类型的相互转换。这里对于负值的情况需要了解什么是原码,反码和补码。参与运算的是补码。-2 的原码是 1000 0010 反码是 1111 1101 补码 在反码的基础最后一位加 1 得到1111 1110。
最终结果得到 0000 1010 & 1111 1110 = 0000 1010 十进制也就是 10。
这个时候怎么校验结果是否正确呢? 直接写 Java 代码就好了, 打开 jshell:
位或 |
按位或, 和逻辑或很类似, 只要二者有一位 1 结果就是 1。
按位或规则如下:
0 | 0 = 0;
0 | 1 = 1;
1 | 0 = 1;
1 | 1 = 1;
根据上面的运算得到了 10 | 2 = 10。
负值有略有不同。
还是要灵活运用原码反码和补码,特别是负数的情况下, 因为正数的原码和补码一致。
位反 ~
按位反, 和逻辑非类似。 是对位进行直接取反。
按位反规则如下:
~1 = 0;
~0 = 1;
先用 2 进行运算处理:
在进行 -2 的运算操作
-2 的原码 需要转换成补码, 用补码进行取反运算。 得到 1 的二进制。
代码演示如下:
位异或 ^
位异或是基于二进制的位运算。 采用符号 XOR 在 Java 中使用 ^ 进行表示。两个值相同取 0, 不同的取 1。
按位异或规则如下:
1 ^ 1 = 0;
0 ^ 0 = 0;
1 ^ 0 = 1;
0 ^ 1 = 1;
举例 10 ^ 2
举例 10 ^ -2
代码演示结果的准确性:
异或在代码优化和实际的工作中会经常用到。 后续实战中用到了在详细分析用法, 现在知道进行异或运算即可。
位左移 <<
将一个操作数进行二进制位往左移, 移动后空出来的低位用 0 进行填充。移除的高位舍去。高位丢弃,低位补零。
操作数 << 移动的位数
举例说明 10 << 2
位左移代码演示:
位右移 >>
将一个操作数进行二进制往右移, 移动后,有两种情况,一种有无符号一种是有符号。也就是最高位为 0 移动后高位补 0, 如果最高位(符号位)为 1, 移动后空缺位都为 1.
操作数 >> 移动的位数
举例说明 10 >> 2
对于负数举例 -2 >> 2 空缺位补 1:
位右移代码演示:
注意这两者的区别。
无符号位右移 >>>
这个是和右移操作上是一致的, 但是不管是否最高位(符号位)为 1, 空缺位都使用 0 进行补齐。
操作数 >>> 移动的位数
举例说明 10 >>> 2
对于负数来说。 这里有点区别, 因为对于负值来说, 上面其实都是 32 位, 为了让大家看起来舒服转换成了对应的 8 位的。 因为无符号位右移会改变正负值, 所以 32 位的负值和 8 位的负值是不一致的。
并且 Java 在处理 byte, short , char 等值进行移位操作前, 会先将类型转换成 int 因为 int 占用 32 位。
所以 -2 >>> 2 的时候,8 位运算应该是如下:
因为会先转换成 32 位。 所以 32 位的 -2 等于如下:
也就是结果: 1073741823
无符号位右移代码如下:
理解原理。 更能发现问题。
类型比较运算符
这里说的类型比较是对象的比较。 判断每个定义的变量是否是某个类。该类可以是(接口、抽象类)。
语法规则:
boolean = 变量 instanceof 类
举例说明:
运行查看结果:
这里需要注意:
null 值是没有引用的, 所以和任何值都不相等。
instanceof 比较的是引用类型, 不能用于基础类型的比较。
条件(三目)运算符
三目运算在 Java 中只有一个就是 ? :
三目运算的语法格式:
大部分情况下, 对于三目运算是 if 和 else 的简写。举例说明:
运算符的优先级
所有的数学运算都是从左向右进行运算的, 对于 Java 来说大部分运算也是遵守从左向右的规则。 但是一元运算符,赋值运算符和三目运算符例外。他们是从右向左进行运算。
运算符的内容告一段落, 接下来就是开始逻辑表达式的学习。 教程编写不易。希望各位大看官点赞收藏加关注。更多内容大放送。
6. java中字符串异或的原理
存在按位异或,就是根据数据在内存中的二进制数的存放形式进行异或操作,
但是不存在字符串的异或
如果在内存中的数据:01010101和10101010异或,结果就是11111111,然后再将
11111111转换成相应的数据输出结果
注意:Java中没有字符串的异或、与、或、非操作,不是C语言那样(除非是你自己定义异或操作)
7. java中按位异或与逻辑异或的区别
逻辑没有异或运算。
位异或指:异或运算^,异或运算它都是以二进制数据为基础进行运算,1^1=00^0=11^0=10^1=1
8. java中a=a^b;b=a^b;a=a^b;它的变化详细过程是怎样的
^int a= 10; // 00001010(二进制)
int b= 5; // 00000101(二进制)
∵0^0=0,1^1=0,0^1=1,1^0=1
∴00001010^00000101=00001111
∵二进制00001111=十进制15
∴a^b = 15
例如:
位运算是C语言的一大特色,利用异或运算可以实现交换两个数,原理是一个整数与另外一个数进行两次异或运算仍然是其本身,基本原理用式子表达如下:
(1) A ^ A = 0;
(2) A = A ^B;
(3) B = A ^B;(相当于B = A ^ B ^ B ,即 B = A)
(4) A= A ^ B;(相当于A = A ^B ^A ,即A = B)
利用位运算不仅提高了代码的执行速度,而且此处还减少了对辅助变量的需求,因此提高了程序的效率。
(8)java按位异或扩展阅读:
归零律:a ⊕ a = 0
恒等律:a ⊕ 0 = a
交换律:a ⊕ b = b ⊕ a
结合律:a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
自反:a ⊕ b ⊕ a = b.
d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
若x是二进制数0101,y是二进制数1011;
则x⊕y=1110
只有在两个比较的位不同时其结果是1,否则结果为0
即“两个输入相同时为0,不同则为1”!