按位与,按位或,按位异或,按位取反

来源:互联网 发布:四川大学自考网络班 编辑:程序博客网 时间:2024/05/16 14:11

转载请注明出处:http://blog.csdn.net/droyon/article/details/9335537

一、按位与

运算规则:1&1=1,1&0=0,0&1=0;

用途:清零,取指定位

int i=7;//0000 0000   0000 0000    0000 0000    0000 0111int j=5;//0000 0000   0000 0000    0000 0000    0000 0101int m=-7;//1000 0000   0000 0000    0000 0000    0000 0111int n=-5;//1000 0000   0000 0000    0000 0000    0000 0101//按位与System.out.println("按位与操作----i(7)&j(5)=?--------------------------");System.out.println("//0000 0000   0000 0000    0000 0000    0000 0111\n"+                           "//&\n"+                   "//0000 0000   0000 0000    0000 0000    0000 0101\n"+                           " = \n"+                   "//0000 0000   0000 0000    0000 0000    0000 0101 = 5");System.out.println("按位与操作结果:"+(i&j));System.out.println("按位与操作----m(-7)&n(-5)?--------------------------");System.out.println("//1000 0000   0000 0000    0000 0000    0000 0111\n"+                           "//&\n"+                   "//1000 0000   0000 0000    0000 0000    0000 0101\n"+                   "//补码:\n"+                   "//1111 1111   1111 1111    1111 1111    1111 1001\n"+                           "//&\n"+                   "//1111 1111   1111 1111    1111 1111    1111 1011\n"+                   " = \n"+                   "//1111 1111   1111 1111    1111 1111    1111 1001(补码)\n"+                   "//1000 0000   0000 0000    0000 0000    0000 0111 = -7(原码)");System.out.println("按位与操作结果:"+(m&n));System.out.println("*****************************************************************************\n");

运算结果:

按位与操作----i(7)&j(5)=?--------------------------//0000 0000   0000 0000    0000 0000    0000 0111//&//0000 0000   0000 0000    0000 0000    0000 0101 = //0000 0000   0000 0000    0000 0000    0000 0101 = 5按位与操作结果:5按位与操作----m(-7)&n(-5)?--------------------------//1000 0000   0000 0000    0000 0000    0000 0111//&//1000 0000   0000 0000    0000 0000    0000 0101//补码://1111 1111   1111 1111    1111 1111    1111 1001//&//1111 1111   1111 1111    1111 1111    1111 1011 = //1111 1111   1111 1111    1111 1111    1111 1001(补码)//1000 0000   0000 0000    0000 0000    0000 0111 = -7(原码)按位与操作结果:-7*****************************************************************************

二、按位或

运算规则:0|1=1,0|0=0,1|0 = 1,1|1=1

用途:给位置1.

//按位或System.out.println("按位或操作----i(7)|j(5)=?--------------------------");System.out.println("//0000 0000   0000 0000    0000 0000    0000 0111\n"+                           "//|\n"+                   "//0000 0000   0000 0000    0000 0000    0000 0101\n"+                           " = \n"+                   "//0000 0000   0000 0000    0000 0000    0000 0111 = 7");System.out.println("按位或操作结果:"+(i|j));System.out.println("按位或操作----m(-7)|n(-5)?--------------------------");System.out.println("//1000 0000   0000 0000    0000 0000    0000 0111\n"+                           "//|\n"+                   "//1000 0000   0000 0000    0000 0000    0000 0101\n"+                   "//补码:\n"+                   "//1111 1111   1111 1111    1111 1111    1111 1001\n"+                           "//|\n"+                   "//1111 1111   1111 1111    1111 1111    1111 1011\n"+                   " = \n"+                   "//1111 1111   1111 1111    1111 1111    1111 1011(补码)\n"+                   "//1000 0000   0000 0000    0000 0000    0000 0101 = -5(原码)");System.out.println("按位或操作结果:"+(m|n));System.out.println("*****************************************************************************\n");

运算结果:

按位或操作----i(7)|j(5)=?--------------------------//0000 0000   0000 0000    0000 0000    0000 0111//|//0000 0000   0000 0000    0000 0000    0000 0101 = //0000 0000   0000 0000    0000 0000    0000 0111 = 7按位或操作结果:7按位或操作----m(-7)|n(-5)?--------------------------//1000 0000   0000 0000    0000 0000    0000 0111//|//1000 0000   0000 0000    0000 0000    0000 0101//补码://1111 1111   1111 1111    1111 1111    1111 1001//|//1111 1111   1111 1111    1111 1111    1111 1011 = //1111 1111   1111 1111    1111 1111    1111 1011(补码)//1000 0000   0000 0000    0000 0000    0000 0101 = -5(原码)按位或操作结果:-5*****************************************************************************

三、按位异或

运算规则:0&0=0,0&1=1,1&0=1,1&1=0

用途:特定位反转,两数交换

//按位异或System.out.println("按位异或操作----i(7)^j(5)=?--------------------------");System.out.println("//0000 0000   0000 0000    0000 0000    0000 0111\n"+                           "//|\n"+                   "//0000 0000   0000 0000    0000 0000    0000 0101\n"+                           " = \n"+                   "//0000 0000   0000 0000    0000 0000    0000 0010 = 2");System.out.println("按位异或操作结果:"+(i^j));System.out.println("按位异或操作----m(-7)^n(-5)?--------------------------");System.out.println("//1000 0000   0000 0000    0000 0000    0000 0111\n"+                           "//^\n"+                   "//1000 0000   0000 0000    0000 0000    0000 0101\n"+                   "//补码:\n"+                   "//1111 1111   1111 1111    1111 1111    1111 1001\n"+                           "//^\n"+                   "//1111 1111   1111 1111    1111 1111    1111 1011\n"+                   " = \n"+                   "//0000 0000   0000 0000    0000 0000    0000 0010(补码)\n"+                   "//0000 0000   0000 0000    0000 0000    0000 0010 = 2(原码)");System.out.println("按位异或操作结果:"+(m^n));System.out.println("按位操作可以进行两个数值的交换");int a = m;int b = n;System.out.println("a,b的初始值:a="+a+",b="+b);a=a^b;b=a^b;a=a^b;System.out.println("a,b的操作值:a="+a+",b="+b);System.out.println("*****************************************************************************\n");

运行结果:

按位异或操作----i(7)^j(5)=?--------------------------//0000 0000   0000 0000    0000 0000    0000 0111//|//0000 0000   0000 0000    0000 0000    0000 0101 = //0000 0000   0000 0000    0000 0000    0000 0010 = 2按位异或操作结果:2按位异或操作----m(-7)^n(-5)?--------------------------//1000 0000   0000 0000    0000 0000    0000 0111//^//1000 0000   0000 0000    0000 0000    0000 0101//补码://1111 1111   1111 1111    1111 1111    1111 1001//^//1111 1111   1111 1111    1111 1111    1111 1011 = //0000 0000   0000 0000    0000 0000    0000 0010(补码)//0000 0000   0000 0000    0000 0000    0000 0010 = 2(原码)按位异或操作结果:2按位操作可以进行两个数值的交换a,b的初始值:a=-7,b=-5a,b的操作值:a=-5,b=-7*****************************************************************************

四、按位取反

运算规则:~0=1,~1=0;
用途:移除标志位。
//按位取反System.out.println("按位取反操作----~i=?--------------------------");System.out.println("//~\n"+                   "//0000 0000   0000 0000    0000 0000    0000 0111\n"+                           " = \n"+                   "//1111 1111   1111 1111    1111 1111    1111 1000(补码)\n"+                           "//1000 0000   0000 0000    0000 0000    0000 1000 = -8(原码)");System.out.println("按位取反操作结果:"+(~i));System.out.println("按位取反操作----~m?--------------------------");System.out.println("//1000 0000   0000 0000    0000 0000    0000 0111\n"+                   "//补码:\n"+                   "//1111 1111   1111 1111    1111 1111    1111 1001\n"+                           "//~\n"+                   "//1111 1111   1111 1111    1111 1111    1111 1001\n"+                   " = \n"+                   "//0000 0000   0000 0000    0000 0000    0000 0110\n(补码)\n"+                   "//0000 0000   0000 0000    0000 0000    0000 0110 = 6(原码)");System.out.println("按位取反操作结果:"+(~m));System.out.println("正数i的取反等于(-i-1)");

运行结果:
按位取反操作----~i=?--------------------------//~//0000 0000   0000 0000    0000 0000    0000 0111 = //1111 1111   1111 1111    1111 1111    1111 1000(补码)//1000 0000   0000 0000    0000 0000    0000 1000 = -8(原码)按位取反操作结果:-8按位取反操作----~m?--------------------------//1000 0000   0000 0000    0000 0000    0000 0111//补码://1111 1111   1111 1111    1111 1111    1111 1001//~//1111 1111   1111 1111    1111 1111    1111 1001 = //0000 0000   0000 0000    0000 0000    0000 0110(补码)//0000 0000   0000 0000    0000 0000    0000 0110 = 6(原码)按位取反操作结果:6正数i的取反等于(-i-1)

按位取反,可以配合&和|,进行状态的增加和移除。http://blog.csdn.net/hailushijie/article/details/8675820

五、掩码:

掩码0x00ff
用途:
1、取出某些位。

例如:取出低八位

int a = 0x1234;int b = (a& 0x00ff);

2、特定位置0。

b = a & ~0x00ff;

3、特定为置1。

b = a|0x00ff;

六、异或性质:

1、任何数和自己异或结果为零。
2、任何数和0做异或值不变,和1异或结果为原操作数取反。
3、位运算a1^a2^...a^n = 1,那么a1.. .. an中1的个数为奇数。
4、x^x^y = y。 验证:由于x^x = 0,0 ^y = y,故上式成立。应用请参照上文按位异或中两数交换的例子