java的位运算符

位运算符主要针对的是二进制,位运算符包括有”与&“、”或|“、”非~“、”异或^“,有点类似逻辑运算符。

注:下面所说的数指的是转成成二进制的数


与运算符(&)

规则:两个操作数对应的位数都为1,结果为1,否则结果为0

A B A&B
1 1 1
1 0 0
0 1 0
0 0 0

public static void main(String[] args) {
		int a = 666;
		int b = 888;
		System.out.println("a与b的结果是:"+(a&b));
	}
a与b的结果是:536
结果的运算过程:

a=666转换成二进制是1010011010

b=888转换陈二进制是1101111000  

根据上面规则计算结果1000011000

二进制转换成十进制:

最终结果:2的9次方  + 2的4次方 + 2的3次方 = 536

int c = Integer.parseInt("1000011000",2);
		System.out.println(c);
公式的含义:

第一个参数表示是二进制数

第二个参数表示是二进制转换成十进制


或运算符(|)

规则:两个操作数对应的位数只要有一个为1,结果就为1,否则就为0

A B A | B
1 1 1
1 0 1
0 1 1
0 0 0

public static void main(String[] args) {
		int a = 666;
		int b = 888;
		System.out.println("a或b的结果是:"+(a|b));
	}
a或b的结果是:1018

结果的运算过程:

a=666转换成二进制是1010011010

b=888转换陈二进制是1101111000  

根据上面规则计算结果1111111010

最终结果:2的9次方  + 2的8次方 + 2的7次方+ 2的6次方 + 2的5次方+ 2的4次方 + 2的3次方 + 2的1次方= 1018


非运算符(~)

规则:二进制的位为0,结果为1;二进制的位为1,结果为0

A ~A
1 0

  0 

1

public static void main(String[] args) {
		int a = 666;
		System.out.println("~a的结果是:"+(~a));
	}
~a的结果是:-667

结果的运算过程:

a=666转换成二进制是1010011010

根据上面规则计算结果0101100101

计算结果之后的规则:

正数(符号位为0的数):原码=反码=补码

负数(符号位为1的数):负数二进制取反加1  

负数的反码、补码与原码不同,负数的反码:关系是原码中除去符号位,其他的数值位取反,0变1,1变0。负数的补码:其反码+1

上面a=666计算步骤  

a=666 的二进制等于 00000000 00000000 00000010 10011010

       ~666之后结果是 11111111 11111111 11111101 01100101

~666二进制码是 11111101 01100101

~666二进制取反 10000010 10011010(反码)

根据计算公式:在符号位为1(负数)的情况下,原码 = 反码 + 1

所以 原码 =10000010 10011010 + 1 = 10000010 10011011  = -(2的9次方 + 2的7次方 + 2的4次方 + 2的3次方 + 2的1次方 + 2的0次方) = -667


非运算比较难理解,这里多举一个例子:

 a为正整数的情况 a=2
    2的二进制等于    00000000 00000000 00000000 00000010
    ~2之后应该为    11111111 11111111 11111111 11111101
    ~2二进制码         11111101 
    ~2二进制码取反 10000010   (反码)
    根据计算公式:在符号为为1(负数)的情况下      原码 = 反码+1
    所以 原码= 10000010 + 1 = 10000011 = -3

    a为负整数的情况a=-2
    -2的二进制   11111111 11111111 11111111 11111110
    ~2之后应该  00000000 00000000 00000000 00000001
    所以a的~a=1;

异或运算符(^)

规则:两个操作数中,相同的则结果为0,不同的则结果为1

A B A^B
1 1 0
1 0 1
0 1 1
0 0 0

public static void main(String[] args) {
		int a = 666;
		int b = 888;
		System.out.println("a^b的结果是:"+(a^b));
	}
a^b的结果是:482

结果的运算过程:

a=666转换成二进制是1010011010

b=888转换陈二进制是1101111000  

根据上面规则计算结果0111100010

最终结果:2的8次方 + 2的7次方+ 2的6次方 + 2的5次方 + 2的1次方= 482




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值