一.基础知识1.要了解java中的位运算,要先看看每种类型占多少位,见下图
2.要知道10进制的数字怎么转为2进制的010101组合的,只需要知道为1的位序号即可。从高位往低位去寻找。
已知整数a,为2**na,且为2**n * 2a时,最高位为n (从第0开始计数)。 然后,对a-2**n的馀数进行相同的运算,直到最后剩下1或0 )。 如果是1,则第0个比特为1,如果是0,则第0个比特为0。
例如:由于99=1*2**6 1*2**5 1*2**1 1* 2**0,所以99的数字用二进制表示,得到0、1、5、6位为1,其他为0
用java的写法计算
publicstaticintgetbitnum (intnum ) if ) num==0) { return -1; (if ) num==1) {System.out.println ) ) 1的位置为)0); 返回0; (/)通过对数变换底公式logx(y )=loge(y ) y )/loge (x )计算intbnum=(int ) (math.log ) num )/Math.log(2) (2) System.out.println ('为1的位置为' bNum ); getbitnum((int ) ) bNum (math.pow ) ) 2,bNum ) )返回bnum; }可以看到} 3.还需要知道运算符的优先级在数学运算符(*/ - )之后有移位运算符
优先级运算符分类联接顺序运算符高
到了
很低
分隔符左连接. [] (; 一元运算符右结合! -- - ~算术运算符
移位运算符
左联接*/% -关系运算符左联接==instanceof(Java特有)==!=逻辑运算符左连接! || ~ | ^三目运算符右结合布尔表达式? 表达式1:表达式2赋值运算符右键=*=/==-=====*=|=2,位运算1.位运算按照优先级排列如下
非() ) 3354左移)、右移)和) —— )、与——的异或(^ ) ——或(|) ) )。
2.位运算
注意:
虽然数据类型所占的字节数有限,但是由于偏移的大小是任意的,所以在偏移之后可能超出该数据类型的表示范围,存在这种规定。
对于int数据类型,如果位移位数大于32位,则首先针对32位来模拟位移位数。 否则,即使位移超过总位数也没有意义。
长型,位移位数大于64位时,首先将位移位数模制成64位,不超过64位时不需要模制成位数。
对于byte、char和short,规则首先扩展为32位,然后根据int类型进行处理
a.非(~)运算
各位的值1变为0,0变为1,
例1 :十进制99,非(() )运算后为100。 如下图计算,上位1为负时,为(99=-1*2**7)1**2**3)1*2**2=-100。
例2:10进制- 20,1变0,0变1得,~-20=1*2**4 1*2**1 1*2**0=19;
根据以上两个例子,~99=-99 - 1; 得到(-20=-)-20 )-1,对数a相反,-a=((~a ) 1;
b.左移()
在当前类型的数值范围中,没有向左移动1位,所以得到的数值变为2倍,移动n位后变为a*2**n
c.右移()
如下图所示,991=49,993=12,向右移动几个a位,变为(int ) ) a/2**n )
d.无符号右移()
无符号右移是指无论正数还是负数都在高位补0。 如果是正数,则规则与带符号右移()相同。 如果是负数,请看下图。
e.与运算()
符合的位置都是1,结果才是1,否则为0,即10=0,01=0, 0=0; 11=1。
例如:判断数字的奇偶性,如果a1=1,则a为奇数; a1=0时,a为偶数
f.或运算(|)
用两个数进行或(|)运算,如果对应位置有一个数字的值,则为1,否则为0,即1|1=1,1|0=1,0|1=1,0|0=0;
例如:在传输了物联网等数据后,接收方可能需要根据某种规则进行操作后再进行分析。 如果将接收到的数字a的第n位设为1,则为:
b=a|(1n ); (a把数字的第n位定为1。
g.异或运算(^)
如果相应的比特相同,则为0,否则为1,即0 ^0=0,1 ^1=0; 0 ^1=1,1 ^0=1;
例1:0异或的任意数值为任意数,a ^ 0=a;
示例2:交换两个变量x、y的值而不使用第一个变量。
x ^=y; y ^=x; x ^=y; 如下图所示,三种颜色分别表示三次异或(^ )运算的过程
好的,今天的共享到此为止。 如果有错误的地方请指出来。