• c# & (与) 、^ (异或)和 >>(<<位移运算)


    &:与  运算

        1.&操作两个bool类型的值,和&&类似。

           if( fun1() & fun2() )两个函数都会执行;if( fun1() && fun2() ) 如果fun1()为false,fun2()不会执行

        2.& "与"运算  操作两个int或short 类型。 0&0==0 ;  0&1 == 0; 1&0==0; 1&1=1;

          比如 4&2  先转换成二进制再求与    就是100&10

          100

          010  

          000     则 4&2 = 0;

     ^ :   异或运算  

      转成2进制相加,1^1 = 0;

                            1^0 = 1;

                            0^1 = 1;

                            0^0 = 0;

      例子: int a = 8; int b=4;  a和b不借助第三个变量实现值互换

        a = a^b ;                    1000

                                         + 100

                             ------------------------ 

         a  =                            1100

       b=b^a ;  //同理可算出  b = 100^1100 = 1000

       a= a^b; //同理可算出  a = 1000^1100 = 100

    转换成10进制  b = 8; a=4;

    位移运算符:>> 和 <<:

         http://346386938.blog.163.com/blog/static/38439420201041504334323/

    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
        {
            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);
                }
    
            }
        }  

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

     5<<2结果是:20

     10<<2结果是:40

     5>>2结果是:1

     10>>2结果是:2

    C#移位运算问题:

    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();
    
            }
    
        }

    请问这里为什么(c >> 16) & 0xffff的值会是26?还有c & 0x00ff的值为什么是52?

     

    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了

         

      

  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/chengjunwei/p/3671266.html
Copyright © 2020-2023  润新知