📜  C#按位和移位运算符

📅  最后修改于: 2020-10-06 09:24:38             🧑  作者: Mango

在本教程中,我们将详细了解C#中的按位和移位运算符 。 C#提供4位和2位移位运算符。

按位和移位运算符用于对整数(int,long等)和布尔数据执行位级运算。这些运算符在现实生活中并不常用。

如果您有兴趣探索更多内容,请访问按位运算的实际应用。

下面列出了C#中可用的按位和移位运算符 。

List of C# Bitwise Operators
Operator Operator Name
~ Bitwise Complement
& Bitwise AND
| Bitwise OR
^ Bitwise Exclusive OR (XOR)
<< Bitwise Left Shift
>> Bitwise Right Shift

按位或

按位或运算符由|表示| 。它对两个操作数的相应位执行按位或运算。如果任一位为1 ,则结果为1 。否则结果为0

如果操作数的类型为bool ,则按位或运算等效于它们之间的逻辑或运算。

例如,

14 = 00001110 (In Binary)
11 = 00001011 (In Binary)

14至11之间的按位OR运算:

00001110
00001011
--------
00001111 = 15 (In Decimal)

示例1:按位或

using System;
 
namespace Operator
{
    class BitWiseOR
    {
        public static void Main(string[] args)
        {
            int firstNumber = 14, secondNumber = 11, result;
            result = firstNumber | secondNumber;
            Console.WriteLine("{0} | {1} = {2}", firstNumber, secondNumber, result);
        }
    }
}

当我们运行程序时,输出将是:

14 | 11 = 15

按位与

按位AND 运算符由&表示。它对两个操作数的相应位执行按位与运算。如果任一位为0 ,则结果为0 。否则结果为1

如果操作数的类型为bool ,则按位与运算等效于它们之间的逻辑与运算。

例如,

14 = 00001110 (In Binary)
11 = 00001011 (In Binary)

14至11之间的按位AND运算:

00001110
00001011
--------
00001010 = 10 (In Decimal)

示例2:按位与

using System;
 
namespace Operator
{
    class BitWiseAND
    {
        public static void Main(string[] args)
        {
            int firstNumber = 14, secondNumber = 11, result;
            result = firstNumber & secondNumber;
            Console.WriteLine("{0} & {1} = {2}", firstNumber, secondNumber, result);
        }
    }
}

当我们运行程序时,输出将是:

14 & 11 = 10

按位异或

按位XOR 运算符由^表示。它对两个操作数的相应位执行按位XOR操作。如果相应的位相同 ,则结果为0 。如果相应的位不同 ,则结果为1

如果操作数的类型为bool ,则按位XOR运算等效于它们之间的逻辑XOR运算。

例如,

14 = 00001110 (In Binary)
11 = 00001011 (In Binary)

14至11之间的按位XOR运算:

00001110
00001011
--------
00000101 = 5 (In Decimal)

如果您想进一步了解按位XOR的用法,请访问XOR的魔力

示例3:按位异或

using System;
 
namespace Operator
{
    class BitWiseXOR
    {
        public static void Main(string[] args)
        {
            int firstNumber = 14, secondNumber = 11, result;
            result = firstNumber^secondNumber;
            Console.WriteLine("{0} ^ {1} = {2}", firstNumber, secondNumber, result);
        }
    }
}

当我们运行程序时,输出将是:

14 ^ 11 = 5

按位补码

位补运算符由~表示。它是一元运算运算符,即仅对一个操作数进行运算。 ~ 运算符每个位取反 ,即将1更改为0,将0更改为1。

例如,

26 = 00011010 (In Binary)

26的按位补码运算:

~ 00011010 = 11100101 = 229 (In Decimal)

示例4:按位补码

using System;
 
namespace Operator
{
    class BitWiseComplement
    {
        public static void Main(string[] args)
        {
            int number = 26, result;
            result = ~number;
            Console.WriteLine("~{0} = {1}", number, result);
        }
    }
}

当我们运行程序时,输出将是:

~26 = -27

当我们期望229时,我们的输出为27为什么会这样?

发生这种情况是因为我们期望为229的二进制值11100101实际上是-27的2的补码表示。计算机中的负数以2的补码表示形式表示。

对于任何整数n,n的2的补n将为-(n+1)

2’s complement
Decimal Binary 2’s Complement
0 00000000 -(11111111 + 1) = -00000000 = -0 (In Decimal)
1 00000001 -(11111110 + 1) = -11111111 = -256 (In Decimal)
229 11100101 -(00011010 + 1) = -00011011 = -27

溢出值在2的补码中被忽略。

26的按位补码是229(十进制), 229的2的补码是-27 。因此,输出是-27而不是229


按位左移

按位左移运算符由<<表示。 << 运算符将数字向左移动指定的位数。零添加到最低有效位。

以十进制表示,相当于

num * 2bits

例如,

42 = 101010 (In Binary)

42的按位提升移位操作:

42 << 1 = 84 (In binary 1010100)
42 << 2 = 168 (In binary 10101000)
42 << 4 = 672 (In binary 1010100000)

示例5:按位左移

using System;
 
namespace Operator
{
    class LeftShift
    {
        public static void Main(string[] args)
        {
            int number = 42;

            Console.WriteLine("{0}<<1 = {1}", number, number<<1);
            Console.WriteLine("{0}<<2 = {1}", number, number<<2);
            Console.WriteLine("{0}<<4 = {1}", number, number<<4);
        }
    }
}

当我们运行程序时,输出将是:

42<<1 = 84
42<<2 = 168
42<<4 = 672

按位右移

按位左移运算符由>>表示。 >> 运算符将数字向右移动指定的位数。第一个操作数向右移动第二个操作数指定的位数。

以十进制表示,相当于

floor(num / 2bits)

例如,

42 = 101010 (In Binary)

42的按位提升移位操作:

42 >> 1 = 21 (In binary 010101)
42 >> 2 = 10 (In binary 001010)
42 >> 4 = 2 (In binary 000010)

示例6:按位右移

using System;
 
namespace Operator
{
    class LeftShift
    {
        public static void Main(string[] args)
        {
            int number = 42;

            Console.WriteLine("{0}>>1 = {1}", number, number>>1);
            Console.WriteLine("{0}>>2 = {1}", number, number>>2);
            Console.WriteLine("{0}>>4 = {1}", number, number>>4);
        }
    }
}

当我们运行程序时,输出将是:

42>>1 = 21
42>>2 = 10
42>>4 = 2