按位与,按位或,按位异或,按位取反
2013-07-15 19:56
232 查看
转载请注明出处: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 0111 int j=5;//0000 0000 0000 0000 0000 0000 0000 0101 int m=-7;//1000 0000 0000 0000 0000 0000 0000 0111 int 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=-5 a,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,故上式成立。应用请参照上文按位异或中两数交换的例子
相关文章推荐
- 按位与、按位异或、按位取反
- 按位与、按位异或、按位取反
- 按位与(&)按位或(|)按位异或(^)按位取反(~)左移(<<)右移(>>)
- C语言位运算符:与、或、异或、取反、左移和右移
- 位运算小结(按位与、按位或、按位异或、取反、左移、右移)
- 二进制位运算(与、或、异或、取反)
- C语言位运算符:与、或、异或、取反、左移和右移
- java中与运算,或运算,异或运算,取反运算
- C语言位运算符:与、或、异或、取反、左移和右移
- 按位与、按位异或、按位取反
- awk:左移、右移、按位取反、按位与、按位或、按位异或、数值IP转字符串IP
- PHP中关于位运算符 与 或 异或 取反
- 按位与(&)按位或(|)按位异或(^)按位取反(~)左移(<<)右移(>>)
- C语言位运算符:与、或、异或、取反、左移与右移详细介绍
- C语言位运算符:与、或、异或、取反、左移和右移
- C语言位运算符及作用:与、或、异或、取反、左移和右移
- 内存中原码,反码,补码,查看数值范围,&,或,异或,取反,左右移位操作
- C语言位运算符:与、或、异或、取反、左移和右移
- C语言位运算符:与、或、异或、取反、左移与右移介绍
- python--- 难缠符号,二进制,位移,取反,异或,按位与,按位或,奇偶判断,硬盘容量,真假