位运算符 计算
位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”
一些位运算符不但可以用于两个数值间,也可以用于两个表达式之间,如"与"、”或“等,这里我们主要探讨前者
与运算符(&)
与:即都要满足
(两个操作数的二进制位 只有都是1时结果才是1)
int a=12;
int b=5;
System.out.println(a&b);
a 的值是12,转换成二进制就是0000 1100
b 的值是5 , 转换成二进制就是0000 0101
只有两个位都是1,结果才是1,可知结果是0000 0100,即4。
或运算符(|)
或:即只要有一个满足
两个操作数的二进制位 只要有一个为1,那么结果就是1
int a=12;
int b=5;
System.out.println(a|b);
a 的值是12,转换成二进制就是0000 1100
b 的值是5 , 转换成二进制就是0000 0101
两个位只要有一个是1,结果就是1,可知结果是0000 1101,即13。
异或(^)
异或:即不一样
两个操作数的二进制位,相同则为0,不同则为1
int a = 12;
int b = 5;
System.out.println(a^b);
a 的值是12,转换成二进制就是0000 1100
b 的值是5, 转换成二进制就是0000 0101
两个位相同为0,不同为1,则结果为0000 1001,即9。
非(~)
非操作符用在一个数的前面,用于对该数的每一个二进制位取反
System.out.println(~2);
在说这个之前,我们先说个概念:
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以用补码统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
原码:二进制表示。二进制首位是符号位,0为正,1为负
反码:正数,反码和原码一样;负数,符号位不变,其他各位取反
补码:正数,补码和原码一样;负数,反码末位加1,有进位则进位,但不改变符号位
此外,负数补码按位取反(不包括符号位)再+1也可得到原码
前面我们说了,数值一律用补码来表示和存储,2的补码为 0000 0010
做非运算后得到 1111 1101(这是一个补码,需要将其转为原码)
先按位取反 1000 0010
再+1 :1000 0011
得到-3。
计算 ~A(A为一个数)的快捷方法
~A = - (A+1)
文章参考链接
https://blog.csdn.net/weixin_44917390/article/details/106181778
https://www.cnblogs.com/shuaiding/p/11124974.html
上一篇: 2010-8-3扯淡 算法面试TokyoCabinetSolrMySQL
下一篇: 二次封装泛型数组