zoukankan      html  css  js  c++  java
  • C#位运算符的基本用法

    位运算符包括:| 按位或 OR,& 按位与 AND,^ 按位异或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等。本篇体验位运算符在C#中的应用。主要包括:

     

    进制转换
        ※ 十进制转换成二进制
        ※ 二进制转换成十进制
    | 按位或操作符
    & 按位与操作符
    ^ 按位异或操作符
        ※ 使用^按位异或交换2个数
        ※ 使用^按位异或进行加密运算
    ~ 取反操作符
    x << n 左移运算符
    x >> n 右移运算符

     

      进制转换

    因为位运算是在二进制基础上进行的,所以进制转换是位运算的前提。

     

    □ 十进制转换成二进制

    比如,把10进制的数783转换成二进制,经过下面10个步骤。

    1
    把余数从下到上拼接起来,就是783的二进制,即1100001111。

     

    在C#中,如果是Int16类型,意味着有16位整型数。对于783来说,如果表示成Int16类型,不足16位的话,要在前面补0,即要在1100001111补6个0,完整的表示是:0000001100001111。同样的道理,如果是Int32类型,意味着有32位整型数。

     

    如何把-783转换成Int16类型的二进制呢?

    →我们知道正数783表示成Int16类型的二进制是:0000001100001111
    →在每个位置上倒转,即如果是1就变成0,反之亦然,倒转后变成:1111110011110000
    →再加上1,变成:1111110011110001

     

    □二进制转换成十进制

    比如,把Int16类型的二进制数0000000100010110转换成十进制,经过下面的16个步骤。

    从右向左,依次乘以2的n次方。
    2
    把所有的结果加起来:
    0 + 2 + 4 + 0 + 16 + 0 + 0 + 0 + 256 + 0 = 2 + 4 + 16 + 256 = 278
    所以,0000000100010110的十进制数是278。

     

    如何把一个Int16类型的负二进制数转换成十进制呢?

    比如有这样的一个二进制数:1111111111010011(Int16类型,第一位是数字1表示负数,第一位是数字0表示正数)
    →每个位置上反转变成:0000000000101100
    →进过计算,得到的十进制数是:44
    →再加1,得到:45
    →再变成负数,得到:-45

      | 按位或操作符

    假设,十进制数38和53进行按位或计算。
    →经过计算,十进制数38的二进制表达是00100110,十进制数538的二进制表达是00110101。
    →对| 按位或操作符来说,只要对应的二个二进位有一个为1时,结果就为1。
    3
    →把得到的00110111转换成十进制就是:55

     

    如果用C#表示就是:

    byte result = 38 | 53;

      & 按位与操作符

    假设,十进制数76和231进行按位与计算。
    →经过计算,十进制数76的二进制表达是01001100,十进制数231的二进制表达是11100111。
    →对& 按位与操作符来说,只要对应的二个二进位有一个为0时,结果就为0。
    4
    →把得到的 01000100转换成十进制就是:68

     

    如果用C#表示就是:

    byte result = 76 & 231;

      ^ 按位异或操作符

    假设,十进制数138和43进行按位与计算。
    →经过计算,十进制数138的二进制表达是10001010,十进制数43的二进制表达是00101011。
    →对^ 按位异或操作符来说,当两对应的二进位相异时,结果为1。
    5
    →把得到的10100001转换成十进制就是:161

     

    如果用C#表示就是:

    byte result = 138 ^ 43 ;

     

    □ 例子1:使用^ 按位异或交换2个数

    int x = 4; 
    
    int y = 6;
    
    x ^= y;
    
    y ^= x;
    
    x ^= y;
    
    Console.WriteLine(x); //6
    
    Console.WriteLine(y); //4

     

    以上过程是这样的:
    (1)x ^= y,相当于x = x ^ y
    x的二进制是:00100
    y的二进制是:00110
    x和y进行异或,结果是:00010
    x转换成十进制后,x为:2

     

    (2)y ^= x,相当于y = y ^ x
    y的二进制是:00110
    x的二进制是:00010
    y和x进行异或,结果是:00100
    y转换成十进制后,y为:4

     

    (3)x ^= y,相当于x = x ^ y
    x的二进制是:00010
    y的二进制是:00100
    x和y进行异或,结果是:00110
    x转换成十进制后,x为:6

     

    □ 例子2:使用^按位异或进行加密运算

    string msg = "这是我要加密的string字符串";
    
    string k = "mypassword";
    
    for(int i = 0; i < msg.Length; i++)
    
    {
    
        sb.Append((char)(msg[i] ^ k[i % k.Length]));
    
    }
    
    Console.WriteLine(sb.ToString());

      ~ 取反操作符

    假设,十进制数52进行取反计算。
    →经过计算,十进制数52的二进制表达是00110100
    →对~ 取反操作符来说,对应的二进位数按位求反,0变成1,1变成0
    6
    →把得到的11001011转换成十进制就是:203

     

    如果用C#表示就是:

    byte result = ~52;

     

      x << n 左移运算符

    每位向左移动n位,右边空缺的位置补0。
    假设,十进制数154进行左移。
    7

     

    如果用C#表示就是:

    byte b1 = 154;
    
    byte b2 = (byte)b1 << 1;
    
    Console.Writeline(b2);//结果是52,二进制是00110100

     

      x >> n 右移运算符

    每位向右移动n位,左边空缺的位置补0。
    假设,十进制数155进行右移。
    8

     

    如果用C#表示就是:

    byte b1 = 155;
    
    byte b2 = (byte)(b1 >> 1);
    
    Console.WriteLine(b2); // 结果: 77


    总结:
    | 按位或操作符来说,只要对应的二个二进位有一个为1时,结果就为1
    & 按位与操作符来说,只要对应的二个二进位有一个为0时,结果就为0
    ^ 按位异或操作符来说,当两对应的二进位相异时,结果为1
    ~ 取反操作符来说,对应的二进位数按位求反,0变成1,1变成0
    x << n 左移运算符,每位向左移动n位,右边空缺的位置补0
    x >> n 右移运算符,每位向右移动n位,左边空缺的位置补0

     

    参考资料:
    Swapping of variables without Third Variable using XOR Logic
    Understand how bitwise operators work
    http://baike.baidu.com/view/9895739.htm?fr=aladdin

  • 相关阅读:
    多媒体开发(5)&音频特征:声音可以调大一点吗?
    多媒体开发(4):在视频上显示文字或图片--ffmpeg命令
    多媒体开发(3):直播
    多媒体开发(2):录制视频
    多媒体开发(1):播放
    python应用(7):输入与输出
    python应用(6):函数
    python应用(5):变量类型与数据结构
    python应用(4):变量与流程
    PHP接收$_POST表单值为字符串或数组时,对安全转义的处理函数
  • 原文地址:https://www.cnblogs.com/darrenji/p/3921183.html
Copyright © 2011-2022 走看看