int i = 255; i <<= 24; i >>= 24;问题:
如果i是uint类型,最终i结果是多少?
运算符号 | 意义 | 运算对象类型 | 运算结果类型 | 对象数 | 实例 |
---|---|---|---|---|---|
~ | 位逻辑非运算,按位取反 | 整型,字符型 | 整型 | 1 | ~a |
& | 位逻辑与运算,其实与&&逻辑运算符有一致的地方 | 同上 | 同上 | 2 | a & b |
| | 位逻辑或运算,同样与||有类似的地方 | 同上 | 同上 | 2 | a | b |
^ | 位逻辑异或运算 | 同上 | 同上 | 2 | a ^ b |
<< | 位左移运算 | 同上 | 同上 | 2 | a<<4 |
>> | 位右移运算 | 同上 | 同上 | 2 | a>>2 |
~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。
int a = 1001 0001; // 十进制:145 int b = ~a; // b = 0110 1110,即十进制:110
int a = 13; int b = -14; Console.WriteLine(~a); // -14 Console.WriteLine(~b); // 13;这个是怎么操作二进制的呢,首先要要记住一些原则,**就是正数的反码,补码都是其本身的源码,负数的反码是符号位不变,本身的0变1,1变0,补码就是反码+1,最后进行补码取反时连同符号位一起变得到的反码就是结果:
int b = 1111 1110; // 前面的1111表示符号位 反码 = 1111 0001; // 符号位不变 补码 = 1111 0010; // 反码加1 补码取反 = 0000 1101; // 得到新的反码就是结果,连同符号位一起反) int a = 0000 1101; 源补码 = 0000 1101; 源补码取反 = 1111 0010; // 得到一个新源码(既不是补码,也不是反码),连同符号位一起取反 新源码补码 = 0000 0001; // 新的补码,将新源码减1 新的补码取反 = 1111 1110; // 得到新的反码,就是结果上面先进行的负数的按位取反操作,首先得到反码,然后负数的补码操作是反码加1,符号位都不变,然后把得到的补码取反(符号位一起取反),得到的反码就是结果,符号位为0,结果得正。
int a = 13; int b = 14; int result = a & b; // 12转换为二进制:
int a = 0000 1101; int b = 0000 1110; int result = 0000 1100;&运算符会对二进制相同位置上面的0和1进行对比,当相同位置数字相同时就返回这个相同的数,否则就返回0,是不是和&&运算符判断两个bool 一致则返回True,否则返回False类似。所以我们得到了result这个结果,转化成十进制就是12了。
int a = 13; int b = 14; int result = a | b; // 15转换为二进制:
int a = 0000 1101; int b = 0000 1110; int result = 0000 1111;其实判断方式是一样的,只是返回的结果不一样, | 运算符判断两个二进制相同位置的0和1,只要其中一个位置的数字是1就返回1,是不是和 || 运算符同样很类似,只要一个True则返True,再把得到的结果转化成10进制就是15了。
int a = 13; int b = 14; int result = a ^ b; // 3转换为二进制:
int a = 0000 1101; int b = 0000 1110; int result = 0000 0011;从中可以看出,^ 判断相同位置上面的数字时,如果两个数相同,不论是0还是1都返回0,如果其中一个为1就返回1。而 | 是只要有一个只要位置上一个为1就返回1,所以名字叫异或(不同的返回或)。
byte a = 0110 0101; a <<= 3;//0010 1000将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。
x<<1= x*2 x<<2= x*4 x<<3= x*8 x<<4= x*16
byte a = 0110 0101; a >>= 3;//0000 1100将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。
x>>1= x/2 x>>2= x/4 x>>3= x/8 x>>4= x/16三. 总结及问题答案
int i = 255; // 00000000 00000000 00000000 11111111 i <<= 24; // 11111111 00000000 00000000 00000000 i >>= 24; // 11111111 11111111 11111111 11111111;上面移位后是-1,修改i数据类型为uint:
uint i = 255; // 00000000 00000000 00000000 11111111 i <<= 24; // 11111111 00000000 00000000 00000000 i >>= 24; // 00000000 00000000 00000000 11111111;无符号类型移位后是原来的数值255,int和uint位移后结果不同的原因: