位运算

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
 
posted @ 2025-04-08 18:11  冯继强fjq  阅读(6)  评论(0)    收藏  举报