位运算
1.二进制转十进制
从右至左开始为第0位,如果第m、n位上的数字位1,其他位上的数字为0,那么这个二进制数字的十进制形式就是"2m+2n"。
二进制转换为十进制步骤如下:
二进制数字:0 0 1 0 0 1 0 0
那么结果就是25+22=36,所以二进制"00100100"对应的十进制为36。
2.十进制转二进制
十进制转化为二进制的方法是通过不断地除以2并取余数,然后将余数逆序排列。
十进制转换为二进制步骤如下:
十进制数字:36
步骤一:将十进制的36除以2,记录商和余数。
商为18,余数为0
步骤二:将商继续除以2,记录商和余数,不断重复该步骤,直到商为0为止
商为9,余数为0
商为4,余数为1
商为2,余数为0
商为1,余数为0
商为0,余数为1
步骤三:余数逆序排列(最后的公式获得的余数为1,就是从左向右第1个数字,以此类推)
十进制数字36对应的二进制为"100100"
十进制转二进制代码
static void Print(int num) { for (int i = 31; i >= 0; i--) { Console.Write((num&(1<<i))==0?"0":"1"); } Console.WriteLine(); }
3.左移符号"<<"
"<<"表示左移。比如"1<<3"表示将1转换为二进制的形式,然后向左移动了3位,等价于"1*23=8"
6<<2模拟计算机计算过程如下:
步骤一:6的二进制形式为:"0 0 0 0 0 1 1 0"
步骤二:将二进制向左移动2位,如下(蓝色的为显示的部分,白色为移动后被遮住的部分)
步骤三:将二进制中显示的位用0补齐
"6<<2"底层计算过程就是"00011000",换算成十进制是"6*22=24"
使用代码如下:
Console.WriteLine(6<<2);
4.右移符号">>"
">>"是将二进制数字整体右移。
1个字节是8位(即0000 0000),C#中int类型是占4个字节的,也就是int类型是32位的,这样推理出int类型的最大值是231+230+229+...+22+21+20=4294967295$$,但是在通过Int32.MaxValue获取
获取int类型的最大值却是2147483647,相当于230+229+228+...+22+21+20。事实上确实是32位的int类型是由最高位的1位表示符号位和后面的31位组成,其中参与运算的就是31位。
2的二进制:0000 0000 0000 0000 0000 0000 0000 0010
-5的二进制:1111 1111 1111 1111 1111 1111 1111 1011(至于负数是如何计算后续再讲)
int num=1073741891; Console.WriteLine(num>>2);
原理步骤:
步骤一:将num转换成二进制的形式
num=1073742892 换算成二进制为:0100 0000 0000 0000 0000 0000 0100 0011
步骤二:符号位不动,其余整体向右移动2位(空出的位置使用*代替)
移动前:0100 0000 0000 0000 0000 0000 0100 0011
移动后:000100 0000 0000 0000 0000 0000 0100 0011(绿色的是移动后能显示的二进制)
步骤三:将空白位置使用符号位的数字填充(符号位是1就将空白的位置填1,如果符号位是0就填0)
填充后:000100 0000 0000 0000 0000 0000 0100 0011 (绿色的部分就是num>>1的结果)
步骤四:将二进制转换成十进制
二进制为:0001 0000 0000 0000 0000 0000 0001 0000,转换十进制为:268435472
5.负数(二进制=>十进制)
二进制为:1111 1111 1111 1111 1111 1111 1111 1111
步骤一:符号位确定为"-" (符号位为1表示该数为负数,0表示该数为正数)
步骤二:其他位取反(如果二进制为0则取1,二进制为1则取0)
1111 1111 1111 1111 1111 1111 1111 1111 (取反前)
0000 0000 0000 0000 0000 0000 0000 0000 (取反后)
步骤三:取反后再+1
0000 0000 0000 0000 0000 0000 0000 0000 +1(加之前)
0000 0000 0000 0000 0000 0000 0000 0001 (加之后)【一定是正数,按照正数计算】
步骤四:将得出的二进制改为十进制
0000 0000 0000 0000 0000 0000 0000 0001=$$2^0=1$$
步骤五:加上"-",此时的二进制改为十进制就是-1
6.与"&"
1&1=1
1&0=0
0&1=0
0&0=0
Console.WriteLine(4&7); //结果是4
计算机计算过程:
步骤一:将4和7换算成二进制的形式
4 :0000 0000 0000 0000 0000 0000 0000 0100
7 :0000 0000 0000 0000 0000 0000 0000 0111
步骤二:将4和7的二进制进行&运算得出以下二进制
4 :0000 0000 0000 0000 0000 0000 0000
&
7 :0000 0000 0000 0000 0000 0000 0000
=
0000 0000 0000 0000 0000 0000 0000
步骤三:将得出的二进制转换为十进制为4
7.取反符号"~"
int a=2; int b=~a Console.WriteLine(b); //-3
计算机计算过程:
步骤一:将变量a的值转换为二进制的形式
2:0000 0000 0000 0000 0000 0000 0000 0010
步骤二:将2的二进制中每个位进行取反(即0变1,1变0)
2:0000 0000 0000 0000 0000 0000 0000 0010
1111 1111 1111 1111 1111 1111 1111 1101
步骤三:将取反后获得的二进制转换成十进制
1111 1111 1111 1111 1111 1111 1111 1101 (按照负数改为二进制的方法进行计算得出)
得到的结果为-3
8.相反数
假设数字a,那么它的相反数为(~a+1)或者为-a