java的位运算符
2016-06-22 15:54
351 查看
位运算符主要针对的是二进制,位运算符包括有”与&“、”或|“、”非~“、”异或^“,有点类似逻辑运算符。
注:下面所说的数指的是转成成二进制的数
与运算符(&)
规则:两个操作数对应的位数都为1,结果为1,否则结果为0
a=666转换成二进制是1010011010
b=888转换陈二进制是1101111000
根据上面规则计算结果1000011000
二进制转换成十进制:
最终结果:2的9次方 + 2的4次方 + 2的3次方 = 536
或
第一个参数表示是二进制数
第二个参数表示是二进制转换成十进制
或运算符(|)
规则:两个操作数对应的位数只要有一个为1,结果就为1,否则就为0
结果的运算过程:
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=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=666转换成二进制是1010011010
b=888转换陈二进制是1101111000
根据上面规则计算结果0111100010
最终结果:2的8次方 + 2的7次方+ 2的6次方 + 2的5次方 + 2的1次方= 482
注:下面所说的数指的是转成成二进制的数
与运算符(&)
规则:两个操作数对应的位数都为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
相关文章推荐
- java导出word实现方式二,poi
- 【转载】Java 对象之生
- Java IO
- JAVA常用代码。干货来啦!
- springmvc(基础三) Springmvc 数据绑定
- 深入理解Java内存模型(一)——基础
- 《java并发编程实战》第11章-性能与可伸缩性
- Spring 4.x官方参考文档中文版——第21章 Web MVC框架(14)
- java导出word实现方式一,在jsp中实现
- spring管理下的声明式事务与存储过程之间的记录
- 对象类型转换
- springmvc和mybaits整合(五)-商品查询controller
- java压缩文件
- Java多线程编程总结(转载)
- java常用代码
- Java字符串拆分问题
- Java字符串拆分问题
- java对象类型转换
- Java字符串拆分问题
- Java字符串拆分问题