zoukankan      html  css  js  c++  java
  • .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(因为负数存的补码).对于无符号的数(uint,ushort)等,那不需要关心符号位。

    特别注意:

         对于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位的效果。

  • 相关阅读:
    常用正则表达式(数字、字符、固定格式)
    阿里云serverless使用笔记
    http的get请求与post请求区别
    HTTPS各版本安全策略HTTPS1_1_TLS1_0、HTTPS2_TLS1_0、HTTPS2_TLS1_2
    REST式的web服务
    JAVA Remote Object
    AJAX的核心XMLHttpRequest对象
    SQL中TOP,LIMIT,ROWNUM的用法
    半双工模式和全双工模式
    win7系统网卡驱动正常,网线连接设备正常,但电脑右下角网络图片显示一直在转圈或者显示一个黄色感叹号的解决办法
  • 原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2979726.html
Copyright © 2011-2022 走看看