• 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了

         

      

  • 相关阅读:
    分享:两个栈实现一个队列的功能
    分享:要关注技术,但也要关注所做的事情
    linux网络编程中阻塞和非阻塞socket的区别
    分享:C++参数传递方式
    linux非阻塞socket教程
    有用和有趣的产品秤砣
    查找 grep r TFramedTransport *
    分享:SecureCRT使用VIM语法高亮
    linux 非阻塞 socket Google 搜索
    linux c语言 select函数用法 ITeye技术网站
  • 原文地址:https://www.cnblogs.com/chengjunwei/p/3671266.html
Copyright © 2020-2023  润新知