以前感觉移位运算符自己挺明白的,也许是学的时间长了,后来一看,忘得差不多了。现在参考一些网上的学习资料,将位移运算符整理一下,作为知识点总结,也算个积累。在讲移位运算符之前,先简单补充一下原码与补码的知识。

一.原码与补码

  在计算机系统中,数值一律用补码来存储(表示)。主要原因:使用补码,可以将符号位和其他位统一处理;同时减法也可按加法来处理。另外,两个补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

  1.原码转补码分两种情况

    (1)正数的补码:与原码相同(已知原码求补码)

        例如:+9的原码是0000 1001。补码也是0000 1001。

    (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。

        例如:-7原码为1000 0111(高位为符号位,1表示负数,0表示正数),补码为1111 1001.

  2.补码转原码也分两种情况(已知补码求原码)

    (1)正数的原码:与补码相同

        例如:+9的补码是0000 1001。原码也是0000 1001。

    (2)负数的原码:符号位为1,其余位为该该补码按位取反,然后整个数加1。

        例如:-7的补码是1111 1001,原码是1000 0111。

二.移位运算符

  “<<”和“>>”运算符用于执行移位运算,分别称为左移位运算符和右移位运算符。对于X<<N和X>>N形式的运算,含义是将X向左或向右移动N位,得到的结果的类型与X相同。此处,X的类型只能是int,uint、long或ulong,N的类型只能是int,N的类型只能是int,或者显示转换为这些类型之一,否则变异程序时会出现错误。

  1.左移位运算符

    使用左移位(<<)运算符可以将数向左移位。其作用是所有的位都向左移动指定的次数,高次位就会丢失,低位以0来填充。

    注意:如果第一个操作数是int或uint(32位数),则移位数有第二个操作数的低5位给出(原因是:低5位可表示的数的范围是0~24+23+22+21+20,即0~31,足够一个       32位数移位使用),如果第一个操作数是long或ulong(64位数),则移位数由第二个操作数的低6位给出(原因同上)。在左移时,第一个操作数的高序位被放弃,低序空位       用0填充。移位操作从不导致溢出。

    (1)正数左移位(以85为例,可以视作int 、long、uint、ulong之一,此处视为uint类型,32位)

85的二进制表示:      0000 0000 0000 0000 0000 0000 0101 0101

        85左移(<<)3位:             0000 0000 0000 0000 0000 0010 1010 1000

        移位后的结果十进制表示:      680

    (2)负数左移位(以-85为例,可以视作int 、long之一,此处视为int,32位)

        -85的二进制补码表示:      1111 1111 1111 1111 1111 1111 1010 1011

        -85左移(<<)3位:        1111 1111 1111 1111 1111 1101 0101 1000

        移位后结果的原码表示:       1000 0000 0000 0000 0000 0010 1010 1000

        移位后的结果十进制表示:     -680

  2.右移位运算符

    右移位运算符(>>)是把数向右移位,其作用是所有的位都向右移动指定的次数。

    注意:如果第一个操作数是int或uint(32位数),则移位数有第二个操作数的低5位给出(原因是:低5位可表示的数的范围是0~24+23+22+21+20,即0~31,足够一个       32位数移位使用),如果第一个操作数是long或ulong(64位数),则移位数由第二个操作数的低6位给出(原因同上)。如果第一个操作数为int或long,则右移位是算数移       位(高序空位设置为符号位)。如果第一个操作数是uint或ulong类型,则右移位是逻辑移位(高位填充0)。

   (1)正数右移位(以85为例,可以视作int 、long、uint、ulong之一,按哪个规则都行)

        85的二进制表示:      0000 0000 0000 0000 0000 0000 0101 0101

        85右移(>>)3位:             0000 0000 0000 0000 0000 0000 0000 1010

        移位后的结果十进制表示:      10

    (2)负数右移位(以-85为例,可以视作int 、long之一,此处视为int,32位)

        -85的二进制补码表示:      1111 1111 1111 1111 1111 1111 1010 1011

        -85左移(>>)3位:        1111 1111 1111 1111 1111 1111 1111 0101

        移位后结果的原码表示:       1000 0000 0000 0000 0000 0010 0000 1011

        移位后的结果十进制表示:     -11

c#移位运算符("<<"及">>")详细说明的更多相关文章

  1. C语言移位运算符

    位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位移位运算符的运算对象 ...

  2. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  3. java 移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  4. C++移位运算符

    关于逻辑移位.算术移位可参见迅雷深大笔试题部分.的一道题. 以前看到C++标准上说,移位运算符(<<.>>)出界时的行为并不确定: The behavior is undefi ...

  5. Java中的移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  6. 移位运算符(JAVA)

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>     :     右移运算符,num >&g ...

  7. java中关于移位运算符的demo与总结

    首先,移位运算符有三种,其操作类型只支持:byte / short / char / int和long五种. << 左移运算符,表示将左边的操作数的二进制数据向左移动*位,移动后空缺位以0 ...

  8. (一)《Java编程思想》学习——按位运算符、移位运算符

    (第三章) (一)按位运算符 按位逻辑运算符有: “与”(AND)        & 1&1=1;1&0=0;0&0=0 “或”(OR) | 1|1=1;1|0=1;0 ...

  9. java移位运算符具体解释

    java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的全部位都左移 ...

随机推荐

  1. 个人项目-数组求和(语言:C++)

    prog1详细要求: [第一版本程序Prog1要求:] + 给定一个数组,实现数组元素求和:,具体要求:实现对一维数组(a[100])的所有元素相加运算. + 数据准备:a)数组长度:100:b)数组 ...

  2. 关于如何参与到开源项目中《How To Succeed In Open Source ( In Ways You Haven't Considered Yet )》

    转自:http://gaslight.co/blog/how-to-succeed-in-open-source-in-ways-you-havent-considered-yet It’s Easy ...

  3. 【转】不用软件,解压Win8/Win8.1的install.wim文件

    今天用好压解压Windows 8.1的install.wim文件,居然提示文件损坏,换了7Z仍然如此:其实文件是好的.只不过这些软件暂时不支持罢了,还好可以用dism命令来手动完成. 一.检查镜像版本 ...

  4. mysql 数据库或者表空间使用查询

    直接上语句 查所有数据库占用空间大小 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB') as data ...

  5. cesium编程入门(九)实体 Entity

    cesium编程入门(九)实体 Entity 在cesium编程入门(五)绘制形状提到过添加实体的方法,这一节聊一聊实体相关的一些内容: 先来看 Entity 的各个属性 id 唯一标志,如果没设置, ...

  6. ceph 运维常用指令

    集群 启动一个ceph 进程 启动mon进程 service ceph start mon.node1 启动msd进程 service ceph start mds.node1 启动osd进程 ser ...

  7. k8s 入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  8. PHP 函数功能参考

    basename() 返回路径中的文件名部分 chgrp() 改变文件组 chmod() 改变文件模式 chown() 改变文件所有者 clearstatcache() 清除文件状态缓存 copy() ...

  9. 图解JVM内存分配和回收

    一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...

  10. 这是一次 docker 入门实践

    前言 其实接触 docker 也有一段时间了,但是一直没有做下总结,现在网上关于 docker 的介绍也有很多了,本着好记性不如烂笔头的原则,还是自己再记录一波吧. 实现目标 安装 docker ce ...