位运算符包括:| 按位或 OR,& 按位与 AND,^ 按位异或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等。本篇体验位运算符在C#中的应用。主要包括: ○ 进制转换 ※ 十进制转换成二进制 ※ 二进制转换成十进制 ○ | 按位或操作符 ○ & 按位与操作符 ○ ^ 按位异或操作符 ※ 使用^按位异或交换2个数 ※ 使用^按位异或进行加密运算 ○ ~ 取反操作符 ○ x << n 左移运算符 ○ x >> n 右移运算符 如果用C#表示就是:
byte result = 38 | 53;
& 按位与操作符
假设,十进制数76和231进行按位与计算。 →经过计算,十进制数76的二进制表达是01001100,十进制数231的二进制表达是11100111。 →对& 按位与操作符来说,只要对应的二个二进位有一个为0时,结果就为0。
→把得到的 01000100转换成十进制就是:68
如果用C#表示就是:
byte result = 76 & 231;
^ 按位异或操作符
假设,十进制数138和43进行按位与计算。 →经过计算,十进制数138的二进制表达是10001010,十进制数43的二进制表达是00101011。 →对^ 按位异或操作符来说,当两对应的二进位相异时,结果为1。
→把得到的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
→把得到的11001011转换成十进制就是:203
如果用C#表示就是:
byte result = ~52;
x << n 左移运算符
每位向左移动n位,右边空缺的位置补0。 假设,十进制数154进行左移。
如果用C#表示就是:
byte b1 = 154;
byte b2 = (byte)b1 << 1;
Console.Writeline(b2);//结果是52,二进制是00110100
x >> n 右移运算符
每位向右移动n位,左边空缺的位置补0。 假设,十进制数155进行右移。
如果用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
|
请发表评论