c#移位运算符("<<"及">>")详细说明

原创 2016年08月30日 22:29:34

c#移位运算符("<<"及">>")详细说明

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

一.原码与补码

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

  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#移位运算(左移和右移)

C#是用>(右移) 运算符是用来执行移位运算。左移 (左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。 x x x x同理, 右移即相反:右移 (>>):将第一个操作数向右...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014年01月08日 09:48
  • 2528

c#移位运算符("<<"及">>")详细说明

一.原码与补码   在计算机系统中,数值一律用补码来存储(表示)。主要原因:使用补码,可以将符号位和其他位统一处理;同时减法也可按加法来处理。另外,两个补码表示的数相加时,如果最高位(符号位)有...
  • bnytqepwq
  • bnytqepwq
  • 2016年09月23日 14:46
  • 171

C#中如何把串口接收的两个字节,合成一个short整型

C#2013101301 这里演示两个简单方法: 1.使用移位符。 例: byte[] bytes = new byte[2]{0x31,0x32}; short u16; u16 = (...
  • YJS5613
  • YJS5613
  • 2013年11月13日 09:51
  • 1245

int(有符号数) 和unsigned int(无符号数)-->逻辑右移与算术右移

首先,先看一个例子~ 这个问题测试是否懂得C语言中的整数自动转换原则,有些开发者懂得极少这些东西。当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个意义上...
  • Agoni_xiao
  • Agoni_xiao
  • 2018年01月12日 14:33
  • 68

C#位移运算符

代码如下: /// /// 位移运算符">"右位移运算符 /// 在进行位移运算时,当数值的二进制每次向左移1位就相当于乘以2,当数值每次向右移动一位就相当于...
  • u012322874
  • u012322874
  • 2016年01月06日 10:57
  • 324

C# 使用二进制 逻辑(与、或、非)位移运算 控制系统权限

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Gra...
  • xxj_jing
  • xxj_jing
  • 2014年12月17日 15:36
  • 3585

简简单单学会C#位运算

一、理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二、理解数字进制 ...
  • jiangfei009003
  • jiangfei009003
  • 2016年10月07日 23:18
  • 2474

C#移位运算(左移和右移)

园子里大牛太多了,几乎写什么类型的文章都会有人写过,大牛们写过的东西,偶不写,好象还没那个功力吧。  今天写一个比较有意思的东西 --  C#移位运算(左移和右移)。  C#是用>(右移) 运算符是用...
  • ulark
  • ulark
  • 2010年04月28日 10:16
  • 720

c#中int16 int32 int64区别

c# int Int32 Int64 的区别 int16=short; int32=int; int64=long; Int16 值类型表示值介于 -32768 到 +...
  • hanaixia2007
  • hanaixia2007
  • 2013年06月19日 09:13
  • 11019

C语言之位操作

时间:2018.1.27 作者:Tom 工作:HWE 说明:如需转载,请注明出处。 说明:本文主要参考朱有鹏老师linux嵌入式C语言高级篇笔记,已注明转载。 1.位操作 1.1.位与...
  • wangdapao12138
  • wangdapao12138
  • 2018年01月28日 00:43
  • 13
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#移位运算符("<<"及">>")详细说明
举报原因:
原因补充:

(最多只允许输入30个字)