当前位置:首页 > Windows程序 > 正文

[史上最全]C#(VB.NET)中位运算符工作过程剖析(译)

2021-05-25 Windows程序

介绍

在这篇博客中,我将来讨论与位操作符有关的内容。这篇文章中谈到的位操作符有:

OR(C#中使用“|”,VB.NET中使用Or)

AND(C#中使用“&”,VB.NET中使用And)

XOR(C#中使用“^”,VB.NET中使用Xor)

NOT(C#中使用“~”,VB.NET中使用Not)

左移运算符(C#和VB.NET中都使用<<)

右移运算符(C#和VB.NET中都使用>>)

循环按位移动

循环左移(C#和VB.NET中没有对应的运算符)

循环右移(C#和VB.NET中没有对应的运算符)

位操作符一般用在数值类型上,它作用在数字二进制格式的每一位上(0和1),所以我们先要搞清楚十进制和二进制的相互转换。这篇文章开头我会给出一些(二进制-十进制)转换示例,虽然都是以Byte类型进行说明的,但其他诸如Int32、Int16等数值类型转换的原理是一样的。

位操作符的使用不仅仅只在C#和VB.NET两种语言中,本篇文章只以这两种语言举例。

“二进制-十进制”相互转换

这一节中我将介绍有关十进制与二进制相互转换的内容。

十进制->二进制

假设我们有一个十进制数字783,我们可以使用下面的方法将其转换成二进制:

除法:

 

783 / 2

 

391 / 2

 

195 / 2

 

97 / 2

 

48 / 2

 

24 / 2

 

12 / 2

 

6 / 2

 

3 / 2

 

1 / 2

 

:

 

391

 

195

 

97

 

48

 

24

 

12

 

6

 

3

 

1

 

0

 

余数:

 

1

 

1

 

1

 

1

 

0

 

0

 

0

 

0

 

1

 

1

 

当商为0时,我们停止计算。现在我们从右往左拼接每一步得到的余数,我们会得到1100001111。

按照下面方式可以将一个负十进制数转换为二进制(以-783为例):

先得到783的二进制:0000001100001111(前面空白补0)

按位取反得到:1111110011110000

然后加1得到:1111110011110001

那么,-783的二进制为1111110011110001

怎么确定得到的结果是一个负数呢?这主要依赖于数据类型。如果数据类型为Int16,那么第一位若为0,则为正数,否则为负数。如果数据类型是不带符号的,比如UInt16,那么第一位数不代表符号,1111110011110000就是十进制的64752。

二进制->十进制

如果你有一个二进制数字0000000100010110(Int16),现将每个位的顺序颠倒(你会得到0110100010000000),然后使用以下方法:

b:

 

0

 

1

 

1

 

0

 

1

 

0

 

0

 

0

 

1

 

0

 

0

 

0

 

0

 

0

 

0

 

0

 

* 2n

 

0 * 20

 

1 * 21

 

1 * 22

 

0 * 23

 

1

* 24

 

0 * 25

 

0 * 26

 

0 * 27

 

1

*

28

 

0 * 29

 

0

* 210

 

0

* 211

 

0

* 212

 

0

* 213

 

0

* 214

 

0

* 215

 

结果:

 

0

 

2

 

4

 

0

 

16

 

0

 

0

 

0

 

256

 

0

 

0

 

0

 

0

 

0

 

0

 

0

 

最后将每一步得到的结果相加:

按照下面方式可以将一个负二进制数值转换成十进制(以1111111111010011为例):

将原数按位取反得到:0000000000101100

将取反后的结果转换成十进制:44

将44加1得到45

将45变为负数:-45

最后,负二进制数值1111111111010011的十进制格式为-45

OR运算符(按位或|

OR运算符工作方式

假设现在有两个Byte类型的数38和53,那么我们先将它们转换成二进制格式:

按照下表的方式:

A

 

0

 

0

 

1

 

0

 

0

 

1

 

1

 

0

 

B

 

0

 

0

 

1

 

1

 

0

 

1

 

0

 

1

 

A | B (A Or B)

 

0

 

0

 

1

 

1

 

0

 

1

 

1

 

1

 

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71146.html