[史上最全]C#(VB.NET)中位运算符工作过程剖析(译)
介绍
在这篇博客中,我将来讨论与位操作符有关的内容。这篇文章中谈到的位操作符有:
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
b * 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
- 上一篇:【D3】transition API
- 下一篇:Visual C#每一次新版本的变化