古灵—精怪

导航

C#中的位运算

    

C#的位运算符&,| ,^ ,<<,>> 位 运 算

我们知道任何信息在计算机中都是以二进制的形式保存的位操作符就是对数

据按二进制位进行运算的操作符C#语言中的位操作符有

?? & 与

?? | 或

?? ^ 异或

?? ~ 取补

?? << 左移

?? >> 右移

 

首先 &运算 例如

 

0&0=0;

0&1=0;

1&0=0;

1&1=1;

这说明除了两个位均为1 与运算结果为1 其它情况下与运算结果均为0 比

如2 和10 进行与运算

2 的二进制表示 00000010

10 的二进制表示 00001010

“&”运算的结果 00000010  所以2&10 的结果为2

 

"|"的运算

 

0|0=0

0|1=1

1|0=1

1|1=1

这说明除了两个位均为0 或运算结果为0 其它情况下或运算结果均为1 比

如2 和10 进行或运算

2 的二进制表示 00000010

10 的二进制表示 00001010

或运算的结果 00001010

所以2|10 的结果为10

 

"^"异或运算 如

0^0=0

0^1=1

1^0=1

1^1=0

这说明当两个位相同时异或运算结果为0 不相同时异或运算结果为1 比如

2 和10 进行异或运算

2 的二进制表示 00000010

10 的二进制表示 00001010

异或运算的结果 00001000

所以2^10 的结果为8

 

“~”取补操作 如:

取补运算对操作数的每一位取补如对10 取补结果为

10 的二进制表示 00001010

与运算的结果 11110101

这个二进制对应的具体值与数据类型有关下面的例子清楚地说明了这一点

程序清单7-5

using System;

class Test

{

public static void Main() {

short a = 10;

ushort b = 10;

int c = 10;

uint d = 10;

Console.WriteLine(~10);

Console.WriteLine("short: {0}",~a);

Console.WriteLine("ushort: {0}",~b);

Console.WriteLine("int: {0}",~c);

Console.WriteLine("uint: {0}",~d);

}

}

正确的输出是

-11

short: -11

ushort: -11

int: -11

uint: 4294967285

 

移位运算

 

左移运算将操作数按位左移高位被丢弃低位顺序补0 比如10 的二进制为

00001010 左移一位为00010100 20 左移二位为00101000 40

右移运算时如果操作数x 是int 或long 型 时x 的低位被丢弃其它各位顺序

依次右移如果x 是非负数最高位设成零如果x 为负数则最高位设为1 而当x

的类型为uint 或ulong 型时x 的低位将被丢弃其它各位顺序依次右移高位设为0

比如

程序清单7-6

using System;

class Test

{

public static void Main() {

int x = 16;

Console.WriteLine(x);

int y = x>>2;

Console.WriteLine(y);

y = y>>2;

Console.WriteLine(y);

y = y>>2;

Console.WriteLine(y);

}

}

上面这段程序的输出为

16

4

1

0

如果把上面x 的初始值设为-16 则程序的输出为

-16

-4

-1

-1

 

 

 

 

 

 

posted on 2013-01-08 16:07  古灵_精怪  阅读(121)  评论(0)    收藏  举报