obsidian/笔记文件/2.笔记/移位运算符.md
2025-03-26 00:02:56 +08:00

2.4 KiB
Raw Permalink Blame History

#unity/日常积累

C#是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算。

左移 (<<)

将第一个操作数向左移动第二个操作数指定的位数空出的位置补0。 左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。

x<<1= x2 x<<2= x4 x<<3= x8 x<<4= x16

同理, 右移即相反:

右移 (>>) 将第一个操作数向右移动第二个操作数所指定的位数空出的位置补0。

右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。

x>>1= x/2 x>>2= x/4 x>>3= x/8 x>>4=x/16

当声明重载C#移位运算符时,第一个操作数的类型必须总是包含运算符声明的类或结构,并且第二个操作数的类型必须总是 int,如:

 class Program  
    {  
        static void Main(string[] args)  
        {  
            ShiftClass shift1 = new ShiftClass(5, 10);  
            ShiftClass shift2 = shift1 << 2;  
            ShiftClass shift3 = shift1 >> 2;  
  
            Console.WriteLine("{0} << 2 结果是:{1}", shift1.valA,  shift2.valA);  
            Console.WriteLine("{0} << 2 结果是:{1}", shift1.valB,shift2.valB);  
            Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valA,  shift3.valA);  
            Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valB, shift3.valB);  
  
            Console.ReadLine();  
        }  
  
        public class ShiftClass  
        {  
           public int valA;  
           public int valB;  
  
            public ShiftClass(int valA, int valB)  
            {  
                this.valA = valA;  
                this.valB = valB;  
            }  
  
            public static ShiftClass operator <<(ShiftClass shift, int count)  
            {  
                int a = shift.valA << count;  
                int b = shift.valB << count;  
                return new ShiftClass(a, b);  
            }  
  
            public static ShiftClass operator >>(ShiftClass shift, int count)  
            {  
                int a = shift.valA >> count;  
                int b = shift.valB >> count;  
                return new ShiftClass(a, b);  
            }  
  
        }  
    }

以上表达式,输出结果是:

!Pasted image 20221115113038.png

因为位移比乘除速度快.对效率要求高,而且满足2的幂次方的乘除运方,可以采用位移的方式进行。