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

一.原码与补码

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

  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. 動態修改 XML 欄位

    /* -- for test DECLARE @content VARCHAR(50) DECLARE @folioId VARCHAR(50) DECLARE @opinionType VARCHA ...

  2. Could not load file or assembly 'System.Data.SQLite ... 试图加载格式不正确的程序

    坑爹的System.Data.SQLite. 先给出下载地址:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki ...

  3. 自我简介与Github的注册和使用

    我叫陈鑫,学号1413042059,来自网络工程142班.喜欢打乒乓球,玩策略类游戏,团队竞技.                                                     ...

  4. The J-Link hardware debugging Eclipse plug-in

    Quicklinks If you already know what are the features of the new plug-in and just want to know how to ...

  5. Postgresql 9.6 搭建 异步流复制 和 同步流复制 详细教程

    Basic Replication If you’re feeling overwhelmed, try setting up a slave to see how easy it is! We’ll ...

  6. php 图像处理库ImageMagick windows下的安装

    http://blog.sina.com.cn/s/blog_966e43000101bgqj.html

  7. [Erlang27]如何监控指定目录下的*.beam文件,如果有改动就更新到指定的节点?

    在Erlang In Anger第二章中讲到使用rebar来创建一个Erlang项目(Application或Project) 但美中不足的只是给出了指引,但没有给出详细的步骤. 下面我们就使用reb ...

  8. Solr相似度算法四:IBSimilarity

    Information based:它与Diveragence from randomness模型非常相似.与DFR相似度模型类似,据说该模型也适用于自然语言类的文本.

  9. 使用像素单位设置 EXCEL 列宽或行高

    在导出 Excel 的时候, 经常要需要给列设置宽度或给行设置高度, 在使用 NPOI 或 EppPlus 等组件进行操作的时候, 列宽和行高的单位都不是像素, 好像是英寸,具体是啥也说不清. 平常在 ...

  10. C#计算两个日期之间相差的天数

    说明:如:1900-01-01与1900-01-01之间算一天 private static int DateDiff(DateTime dateStart, DateTime dateEnd) { ...