位运算符包括:| 按位或 OR,& 按位与 AND,^ 按位异或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等。本篇体验位运算符在C#中的应用。主要包括:
○ 进制转换 ※ 十进制转换成二进制 ※ 二进制转换成十进制○ | 按位或操作符○ & 按位与操作符○ ^ 按位异或操作符 ※ 使用^按位异或交换2个数 ※ 使用^按位异或进行加密运算○ ~ 取反操作符○ x << n 左移运算符○ x >> n 右移运算符
进制转换
因为位运算是在二进制基础上进行的,所以进制转换是位运算的前提。
□ 十进制转换成二进制
比如,把10进制的数783转换成二进制,经过下面10个步骤。
把余数从下到上拼接起来,就是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次方。把所有的结果加起来: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。→把得到的00110111转换成十进制就是:55
如果用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); //6Console.WriteLine(y); //4
以上过程是这样的:(1)x ^= y,相当于x = x ^ yx的二进制是:00100y的二进制是:00110x和y进行异或,结果是:00010x转换成十进制后,x为:2
(2)y ^= x,相当于y = y ^ xy的二进制是:00110x的二进制是:000
新闻热点
疑难解答