位操作符一般用在数值类型上,它作用在数字二进制格式的每一位上(0和1),所以我们先要搞清楚十进制和二进制的相互转换。这篇文章开头我会给出一些(二进制-十进制)转换示例,虽然都是以Byte类型进行说明的,但其他诸如Int32、Int16等数值类型转换的原理是一样的。
按位非操作符NOT将会改变二进制中每位的值,0变为1,1变为0。如果一个数值有符号,那么整数经过运算后会变成负数,负数经过变换后会变为正数。如果数值没有符号,那么永远都为正(0除外)。假设你有一个数值52(二进制00110100,Byte类型,无符号),那么~52(VB.NET中的Not 52)的计算方式为:
x>>n表示将x的二进制格式的每位均向右移动n个位置,左边空出来的位置补0(与左移相反)。
如上图所示,每位均向右移动1个位置。所以155>>1的值为77。注意如果为负数,那么它的符号会被隐藏掉。
下表显示的是计算155>>n的值:
循环按位左移会将数值的二进制格式中的每位均向左移动1个位置,然后将移出来的数值(1或0)替补到右边空白处。
上图显示了将154循环按位向左移动1位,它的值等于154<<1|154>>7。循环按位左移得到的结果可以归纳为:a<<n|a>>(b-n)。b为数值的位数,如果数值为Byte类型,那么最后的结果为a<<n|a>>(8-n),如果数值为Int32类型,那么b为32,最后的结果为a<<n|a>>(32-n)。
C#和VB.NET中循环按位左移的使用,可以参见下面:
[VB.NET]
循环按位右移会将数值的二进制格式的每位均向右移动1个位置,然后将移出来的数值(1或0)替补到左边空白处。
如上图所示,将155循环按位右移1个位置,最后它的值等于155>>1|155<<7。循环按位右移得到的结果可以归纳为:a>>n|a<<(b-n)。其中b为数值位数。如果数值为Byte类型,那么结果为a>>n|a<<(8-n),如果数值为Int32类型,那么得到的结果为a>>n|a<<(32-n)。
C#和VB.NET中循环按位右移的使用,可以参见下面代码:
[VB.NET]
译者注:在使用位操作符时,一定要先确定被操作的数值是什么类型,占多少位,同一个数值,数据类型不同,最后得到的结果不一样。原文中,对于任何一个数值(比如52),都在强调它是Byte类型还是Int16类型。