Java中除了常见的运算符如:+、-、*、/、%、++、–等,还有一类不常见的位运算符。位运算符就是^、&、|、~,当这四个运算符两边的值为bool类型时那他们就是逻辑运算符,当这四个运算符两边的值为整数时那他们就是位运算符。位运算符顾名思义是对二进制位进行计算,所以首先要把运算符两边的整数转换为二进制的形式然后进行计算,下面介绍位运算符的计算方式。
^位运算符
当位运算符^两边的二进制整数的对应位相同时,结果位为0,对应位不同时,结果位为1。
public class BitHelper
{
public void TestMethod()
{
// 5:00000101
// 12:00001100
// :00001001,结果为8+1=9
Console.WriteLine("5^12={0}",5^12);//9
}
}
&运算符
当位运算符&两边的二进制整数的对应位都为1时,结果位为1,其他情况下,结果位为0。
public class BitHelper
{
public void TestMethod()
{
// 5:00000101
//12:00001100
// :00000100,结果为4
Console.WriteLine("5&12={0}",5&12);//4
}
}
|运算符
当位运算符&两边的二进制整数的对应位有一个为1时,结果位为1,其他情况下(对应位都是0),结果位为0。
public class BitHelper
{
public void TestMethod()
{
// 5:00000101
//12:00001100
// :00001101,结果为8+4+1=13
Console.WriteLine("5|12={0}",5|12);//13
}
}
~运算符
~运算符是按位取反运算符,求反不是在整数前加一个负号,而是对整数的二进制码求反,得到的反码就是对原整数按位取反的结果。
public class BitHelper
{
public void TestMethod()
{
// 5:00000101
//~5:11111010,~5的二进制码的最高位为1说明~5是一个负数
//按照负数存储过程反向得到该负数:先减1得到11111001->求反得到00000110->值为6->加符号为-6
Console.WriteLine("~5={0}",~5);//-6
}
}
Java中负数的存储原理
1byte(1字节)等于8bit(8位),1byte可以存储256个数字(2的8次方),Java中byte的范围是-128~127。
Java中规定在计算机中如果一个二进制数据的最高位(最左边的位)是1,那么该数据肯定是一个负数;如果一个二进制位数据的最高位是0,那么该数据肯定是一个正数;负数在计算机中存储的是补码。byte是8位如果存整数,最高位肯定是0,后7位都是1时存储的正数最大,二进制数01111111=127,因此byte的范围是-128~127。
负数的存储过程:
-10————–>11110110
1、先取负数的绝对值,求出该绝对值的二进制形式(原码)00001010
2、原码取反得到反码11110101
3、反码加1得到补码11110110
负数的解析过程:
11110110————–>-10
1、补码减1得到反码11110101
2、反码取反得到原码00001010
3、根据原码求得整数10,再加符号得到原数据-10
注意:
Java中byte的存储范围是-128~127,C#中byte的范围是0-255。
C#和Java中位运算符^、&、|、~的运算规则都是相同的。