.Net位运算符&,|,!,^,<<,>>

在.NET中经有时会碰到一些类似于&,|,!,^,<<,>>的运算符,这些运算符到底是啥作用呢。

& 与 如果两个都为1,则结果为1,否则结果为0 
例:10001010 & 00101011 结果为00001010

| 或 如果两个中有一个为1,那么结果为1,两个都为0的时候结果为0 
例:10001010 | 00101011 结果为10101011



!取反 取反码(最高位是符号位)

例:!10001010 结果为11110101



^ 异或 如果两者相同就为0,否则就为1 
例:10001010 ^ 00101011 结果为10100001



~ 取补 取补码 (最高位是符号位) 
例:~10001010 结果为11110110



<< 左移  将操作数按位左移高位被丢弃低位顺序补0

例:10001010 <<4 也就是左移4位 结果为10100000 
注意:对于有符号的数,左移会丢弃符号位,或者符号位会被更改。



<< 右移  将操作数按位右移低位被丢弃,如果是正数高位顺序补0,如果是负数高位顺序补1 
例:10001010 >>4 也就是右移4位 结果为11111000 
注意:对于有符号的数(int,double)等,右移时,最高位的符号位应该不变,如果以前是正数,符号位是0,那么右移后还应该是0,其他位补0, 
如果以前是负数,符号位是1,那么右移后,符号位还应该是1,其他数补1(因为负数存的补码).对于无符号的数(uintushort)等,那不需要关心符号位。



特别注意:

     对于char,byte,sbyte,short等类型进行运算时,编译器默认会把它们转换成int类型(原因可能是对于char,byte来说,进行运算很容易发生溢出),所以在移动的时候,最大只能移动32个位(因为int类型占32位),也就是说右边右移的数,只有前面5位有效,后面被舍弃了。比如右移33位,取33的二进制字符串的低5位,也就是十进制的1,也不是说右移33位相当于右移1位。同理左移也是这样的。

     有时对byte类型进行移位操作,当你左移9位,或者10位的时候,你会发现一直是0,原因也跟上面的一样,对byte移位的时候,是把它转换成int的,而你把int移动9位或者10位是可以的,但是你返回结果是byte类型,所以它只会取低8位,而低8位都是0,所以你看到的是0,如果想看到真实的值,可以返回int类型,这时候就可以看到左移9位或者10位的效果。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值