C#位运算符的基本用法

摘要:
本文体验了位运算符在C#中的应用。在C#中,如果是Int16类型,则表示存在16位整数。→ 经计算,十进制数52的二进制表达式为00110100→ 对于负~运算符,对应的二进制数字逐位反转,0变为1,1变为0→ 如果用C#表示,则得到的11001011被转换为十进制:203:byteresult=~52;x˂˂n左移位运算符为每个运算符向左移动n位,而为右空位置填充0。

位运算符包括:| 按位或 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

免责声明:文章转载自《C#位运算符的基本用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CRM开发手记 Javascript KeycodeJAVA 获取类名,函数名下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

二进制运算-十进制与二进制的转换

在学习JDK源码和JAVA一些开源框架源码的时候经常会碰到位运算,要搞懂位运算就得弄明白二进制和十进制之间的转换 一、十进制转换成二进制 1.正整数转换成二进制 十进制整数转换成二进制就是不停的除以二,直到不足二为止(0或者1),然后记录余数,从下往上排列出来就是二进制的值 举个例子:5和8转换成二进制 5的二进制为101,8的二进制为1000 2.负整...

js 计算浮点数

JS的浮点计算 最近遇到了数值计算的时候,计算结果出现了类似于199.9999999999999999999的情况,但是被用来计算的两个数值都只是两位数。 就像这样      --------》         0.1 + 0.2 = 0.30000000000000004。 其实对于浮点数的四则运算,几乎所有的编程语言都会有类似精度误差的问题,...

原码,反码,补码,移位

https://www.cnblogs.com/btgyoyo/p/6371398.html 复习下二进制的有关知识 1.所有的数据都是以二进制的形式存储在硬盘上。对于一个字节的8位到底是什么类型 计算机是如何分辨的呢? 其实计算机并不负责判断数据类型,数据类型是程序告诉计算机该如何解释内存块. 2.对于字符的存储,先将字符转化成其字符集的码点,(码点就是...

JAVA实现二进制,十六进制输出

public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(Integer.toBinaryString(320*1024)); System....

使用Pls_Integer的好处

如果你要做循环的记数器,可以使用pls_integer. pls_interger,binary_integer,number中,pls_integer速度最快。   转的别人的: Binary_Integer 与 Pls_Integer 都是整型类型. Binary_Integer类型变量值计算是由Oracle来执行,不会出现溢出,但是执行速度较慢,因为...

Keil 二进制数输入宏

源:http://hi.baidu.com/skystalker/item/e7679cd79c6f751220e250c1?qq-pf-to=pcqq.c2c 在C语言中有十进制,十六进制,八进制;没有二进制的定义,在C51中使用十六进制表示有时不太直观,下面介绍几种方法表示二进制[均来自网络] 方法一 #define _BIN(a,b,c,d,e,f,...