Java中的这几个位运算符有大神讲解一下不?最好举生活中的例子,谢谢!
1个回答
展开全部
/**
我通俗点说:在位运算里面,其实大多数都是进行二进制运算的,也就是0和1,之间的运算!
以下例子里面:0代表假,1代表真;
按位与:&
真与真=真;(1&1=1)
假与假=假;(0&0=0)
真与假=假;(1&0=0)
假与真=假 ;(0&1=0)
总结(在按位与里面,逢假(0)必假(0));
-----------------------------------------------------------------
按位或:|
真与真=真;(1|1=1)
假与假=假;(0|0=0)
真与假=假;(1|0=1)
假与真=假 ;(0|1=1)
总结(在按位或里面,逢真(1)必真(1));
-----------------------------------------------------------------
按位异或:^
真与真=真;(1^1=0)
假与假=假;(0^0=0)
真与假=假;(1^0=1)
假与真=假;(0^1=1)
总结(在按位或里面,相同就(0)不同则(1));
----------------------------------------------------------------
按位非~
这个我思前想后了很久,我觉得我不好更通俗的讲解;
(请原谅,我尽可能的保持通俗)
我要是跟你讲这个,你需要了解一点基本知识,才比较好理解一点!
你了解这个:(源码--反码---补码),我比较好讲一点!
a:所有字面值常量(你暂时理解基本数字):他们在内存里面存储的时候,都是以二进制的补码形式存在的!
b:不管正数还是负数,在内存里面存储都是补码!
c:不同点就是:正数的源码,反码,补码,都一样!
d:负数则不一样,一个负数的补码,是该正数的源码--->逐位取反--->然后末尾+1--->得到的就是该负数在内存里面存储的形式(补码)!
e:正数的最高位,即(最左边第一位是0,其他位有效值位),负数的最高位,即(最左边第一位是1,其他位是有效数值位!)
好了,基本知识我说完了,不好意思我只有这能力了,能不能看懂完全看造化了!
--->>进入主题:
按位非,是一元运算符:
它的作用是一把个数字的补码,逐位取反,得到另外一个数字的补码!这个我觉得需要举例比较容易理解一点:
例子:假如(非5:~5),因为5是正数,所以5的二进制在内存里面形式都一样,举短一点的吧,byte类型,8位!
0 0 0 0 0 1 0 1<<---5的二进制;
1 1 1 1 1 0 1 0<<---按位非~,0变1,1变0(变完以后,这个是另外一个数字的补码,因为是负数,我们不好看,但是我们可以还原他的正数,就知道该数是几了!)
0 0 0 0 0 1 0 0<<---按照上面d步骤逆向过来,末尾-1--->>逐位取反--->>得到该数正数的原码!
所以你看这个数字有效位是4;所以,上面的那个负数补码就是-4,总结( ~5 = -4 );
我天,我都尽可能说详细了...还是觉得怕你看不明白!
--------------------------------------------------------------------------------
左移:<<(理解是乘法,2的n次幂,2是底数!)--->>低位补零
5<<2=20 等价 5x(2x2)=20
6<<3=48 等价 6x(2x2x2)=48
4<<4=64 等价 4x(2x2x2x2)=64
右移:>>(理解是除法,倍率同上)---->>如果是正数,在高位补零,如果是负数,则在高位补1
8>>2=2 等价 8÷(2x2)=2;
16>>3=2 等价 16÷(2x2x2)=2;
-16>>3=-2 等价 -16÷(2x2x2)=-2;
无符号右移>>>(和右移是一回事,区别在后面)--->不管正负数:高位都是补0;
16>>3=2 等价 16÷(2x2x2)=2;
-16>>3=-2 等价 16÷(2x2x2)=2;
(不管正负还是负数,结果都是正数,懂了?这就是无符号右移的区别!)
-------------------------------------------------------------------------------
这些知识都是非常基础的知识,很关键,也很重要,如果我说的你看不懂,也没关系,你可以跳过这一步,向后面学习
学一段时间后,在回头看看..会恍然大悟的!!
不好意思解答能力有限:不足之处还请路人..指点!!
*/
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询