int 32位,补码存储
创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站制作、网站建设、双湖网络推广、小程序定制开发、双湖网络营销、双湖企业策划、双湖品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供双湖建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
int a = 51;
int b = -16;
System.out.println("51 =" + Integer.toBinaryString(a));
System.out.println("-16 =" + Integer.toBinaryString(b));
int c = a^b;
System.out.println("异或 =" + Integer.toBinaryString(c));
System.out.println("即 =" + c);
51 =110011
-16 =11111111111111111111111111110000
异或 =11111111111111111111111111000011
原码为1000。。。111101
即 =-61
首先回答你问的问题:
按位与运算符()
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:00=0; 01=0; 10=0; 11=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:35 即 0000 0011 0000 0101 = 0000 0001 因此,35的值得1。
另,负数按补码形式参加按位与运算。
“与运算”的特殊用途:
(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
(2)取一个数中指定位
方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。
例:设X=10101110,
取X的低4位,用 X 0000 1111 = 0000 1110 即可得到;
还可用来取X的2、4、6位。
按位或运算符(|)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。
另,负数按补码形式参加按位或运算。
“或运算”特殊作用:
(1)常用来对一个数据的某些位置1。
方法:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。
例:将X=10100000的低4位置1 ,用 X | 0000 1111 = 1010 1111即可得到。
异或运算符(^)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
“异或运算”的特殊作用:
(1)使特定位翻转找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。
例:X=10101110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。
(2)与0相异或,保留原值 ,X ^ 0000 0000 = 1010 1110。
从上面的例题可以清楚的看到这一点。
取反运算符(~)
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0。
使一个数的最低位为零,可以表示为:a~1。
~1的值为1111111111111110,再按“与”运算,最低位一定为0。因为“~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。
然后在附送你两个为运算符的解释:
左移运算符()
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
例:a = a 2 将a的二进制位左移2位,右补0,
左移1位后a = a * 2;
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
右移运算符()
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
操作数每右移一位,相当于该数除以2。
例如:a = a 2 将a的二进制位右移2位,
左补0 or 补1 得看被移数是正还是负。
如果还有什么疑问,可以参考一下参考资料
希望我的回答对您有帮助,别忘了采纳答案哦~
首先取反运算符优先级高于异或运算符
其次int是32位
28 = 0001 1100(前面16位不写了)
8 = 0000 1000
-8 = 1111 1000
-28 = 1110 0100
所以a=28^-8 = 0001 1100 ^ 1111 1000 = 1110 0100 = -28
a=-28^8 = 1110 0100 ^ 0000 1000 = 1110 1100 = -20
是-20,不是20。楼主看清楚了。
概述
i = 14,异或算法转换二进制,同则取0异则取1;
解析
异或是一种基于二进制的位运算,用符号XOR或者^表示,其运算法则是对运算符两侧数的每一个进制位同值则取0,异值则取1.
简单理解就是不进位加法,如1+1=0,0+0=0,1+0=1.
For example:
3^5 = 6
转成二进制后就是 0011 ^ 0101 二号位和三号位都是异值取1 末尾两个1同值取零,所以3^5 = 0110 = 6
而 i = 50 ,j = 60;
所以:
i 的二进制 = 00110010
j 的二进制 = 00111100
同位相同取0,不同取1所以得出来的值为00001110
i = i ^ j;所以i = 00001110 = 14
拓展内容
异或运算符
性质
1、交换律
2、结合律(即(a^b)^c == a^(b^c))
3、对于任何数x,都有x^x=0,x^0=x
4、自反性 A XOR B XOR B = A xor 0 = A
异或运算最常见于多项式除法,不过它最重要的性质还是自反性:A XOR B XOR B = A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身。这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。 例如,所有的程序教科书都会向初学者指出,要交换两个变量的值,必须要引入一个中间变量。但如果使用异或,就可以节约一个变量的存储空间: 设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值 表达式 (值) :
A=A XOR B (a XOR b)
B=B XOR A (b XOR a XOR b = a)
A=A XOR B (a XOR b XOR a = b)
#code:
google面试题的变形:一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数?
java中或运算、异或运算、与运算的使用实例和解释如下:
public class Test { public static void main(String[] args) {
// 1、左移( )
// 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:
// // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20 System.out.println(5 2);// 运行结果是20
// 2、右移( ) 高位补符号位
// 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
// 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(5 2);// 运行结果是1
// 3、无符号右移( ) 高位补0
// 例如 -5换算成二进制后为:0101 取反加1为1011
// 1111 1111 1111 1111 1111 1111 1111 1011 /
/ 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
System.out.println(5 3);// 结果是0
System.out.println(-5 3);// 结果是-1
System.out.println(-5 3);// 结果是536870911
// 4、位与( )
// 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
System.out.println(5 3);// 结果为1
System.out.println(4 1);// 结果为0
// 5、位或( | )
// 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
System.out.println(5 | 3);// 结果为7
// 6、位异或( ^ )
// 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
System.out.println(5 ^ 3);//结果为6
// 7、位非( ~ ) // 操作数的第n位为1,那么结果的第n位为0,反之。 System.out.println(~5);// 结果为-6 } }
Java代码:
public class test{
public static void main(String[] args) {
String source = "cghjhgfgsdyugh";
int ch = source.charAt(0);
for(int i=1; isource.length(); i++) {
ch ^= source.charAt(i);
}
System.out.printf("%d : %c\n", ch, ch);
}
}
运行测试:
28 :