{
int num1=10;
int num2=-8;
int nm3=6;
~就是把一个数按位取反:
如6:00000000 00000110
~num3:11111111 11111001
这个符号就是tab上面的那个键,按住shift就能敲出来;
}
{
&按位与就是在补码的基础上,按位与的运算就是要两个数同时为1才为1(注负数要转补码,正数不用);
如 num2 & num1:
-8的原码: 10000000 00001000
10的补码: 00000000 00001010
-8的补码为:11111111 11111000要在-8的反码上加1; -8的反码为:11111111 11110111
然后补码之间计算,结果为:00000000 00001000,因为只有第13位是两个数的补码同时为1,所以结果为 8:00000000 00001000;
}
{
| 按位或就是在补码的基础上,按位两个数有一个为1就为1(注负数要转补码,正数不用);
和上面的类似,先算补码,然后用补码计算,两个数计算有一个为1就为1;
如num1 | num2:
10的补码:00000000 00001010
-8的补码为:11111111 11111000
结果为:11111111 11111010 因为结果为负数,所以要算出他的原码,他的原码10000000 00000110,所以结果是-6;减一算出反码,然后按位取反;
}
{
^ 按位异或就是在补码的基础上,按位两个数不一样的为就为1(注负数要转补码,正数不用);
num2 ^ num1:
//-8的原码 10000000 00001000
//10的原码 00000000 00001010
//-8的补码 11111111 11111000
//10的补码 00000000 00001010
补码按位计算,不一样的为1;
//^结果的补码 11111111 11110010
//^结果的反码 11111111 11110001
//^结果的原码 10000000 00001110
结果为-14;
}
{
<< 在补码的基础上向左移n个位,超出部分去除,后面补0;
如10的补码:00000000 00001010
num1<<3为:00000000 01010000 结果为:80(64加16)以二进制转换十进制计算;
}
{
>> 在补码的基础上向右移n个位,超出部分去除,如果是正数前面补0,负数前面补1;
如num2>>3:
num2=-8
-8的原码为:10000000 00001000;
-8的补码: 11111111 11111000
从后面移除,计算结果的补码为11111111 11111111
原码为10000000 00000001,结果为-1;
}
如下是效果图: