C#移位运算(左移和右移)

今天写一个比较有意思的东西 --  C#移位运算(左移和右移)。

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

  左移 (<<)

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

  x<<1= x*2   x<<2= x*4   x<<3= x*8   x<<4= x*16

  同理, 右移即相反:

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

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

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

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

 

class Program { staticvoid 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(); }
publicclass ShiftClass { publicint valA; publicint valB;
public ShiftClass(int valA, int valB) { this.valA = valA; this.valB = valB; }
publicstatic ShiftClass operator<<(ShiftClass shift, int count) { int a = shift.valA << count; int b = shift.valB << count; returnnew ShiftClass(a, b); }
publicstatic ShiftClass operator>>(ShiftClass shift, int count) { int a = shift.valA >> count; int b = shift.valB >> count; returnnew ShiftClass(a, b); }
} }

 

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

C移位运算(左移和右移) - 海里的贝壳 - apple的博客

 

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

  比较有意思吧?

 

例子2

public class exe     {         public static void Main()         {             int a, b, c;             c = 0x1af034;             a = (c >> 16) & 0xffff;             b = c & 0x00ff;             Console.WriteLine("a is {0}",a );             Console.WriteLine("b is {0}",b );             Console.Read();         }     }

1、   c >> 16 = 0x1AF034 >> 16 = 0x00001A   0x00001A & 0x00FFFF = 0x00001A = 26     2、   c & 0x0000FF = 0x1AF034 & 0x0000FF = 0x000034 = 52     位移运算就是将数字的二进制形式按指定的位数左移或右移,因为十六进制的每位数可以化成一个四位数的二进制的数字(2的四次方为16),所以在二进制中移动16位就是在十六进制中移动16/4 = 4位,那么0x1AF034 >> 16 = 0x00001A     按位且(&)这个运算符,这个运算符的意思是将数字转为二进制逐位进行且比较,按照1且1为1,1且0为0,0且0为0的规则,这样拆开来运算后再整合为结果   其实有个快捷方法,还是因为十六进制的每位数可以化成一个四位数的二进制的数字(2的四次方为16),而且0x0 = 0000B,0xF = 1111B,也就是说如果对应位上数是F,那么这位上的数可以保留,否则变为0,如上面的0x0000FF & 0x1AF034,你可以看到前面的数字只有个位和十位上有数字,所以只保留后面数字的个位和十位就是结果,那么就是0x000034 = 52了
posted @ 2013-01-04 22:46  therockthe  阅读(6900)  评论(0)    收藏  举报