c#移位运算符("<<"及">>")
C#是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算。
左移 (<<)
将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。
左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。
x<<1= x*2
x<<2= x*4
x<<3= x*8
x<<4= x*16
同理, 右移即相反:
右移 (>>)
将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。
右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。
x>>1= x/2
x>>2= x/4
x>>3= x/8
x>>4=x/16
当声明重载C#移位运算符时,第一个操作数的类型必须总是包含运算符声明的类或结构,并且第二个操作数的类型必须总是 int,如:

class Program
{
static void Main(string[] args)
{
ShiftClass shift1 = new ShiftClass(5, 10);
ShiftClass shift2 = shift1 << 2;
ShiftClass shift3 = shift1 >> 2; Console.WriteLine("{0} << 2 结果是:{1}", shift1.valA, shift2.valA);
Console.WriteLine("{0} << 2 结果是:{1}", shift1.valB,shift2.valB);
Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valA, shift3.valA);
Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valB, shift3.valB); Console.ReadLine();
} public class ShiftClass
{
public int valA;
public int valB; public ShiftClass(int valA, int valB)
{
this.valA = valA;
this.valB = valB;
} public static ShiftClass operator <<(ShiftClass shift, int count)
{
int a = shift.valA << count;
int b = shift.valB << count;
return new ShiftClass(a, b);
} public static ShiftClass operator >>(ShiftClass shift, int count)
{
int a = shift.valA >> count;
int b = shift.valB >> count;
return new ShiftClass(a, b);
} }
}

以上表达式,输出结果是:

因为位移比乘除速度快.对效率要求高,而且满足2的幂次方的乘除运方,可以采用位移的方式进行。
转:https://www.cnblogs.com/tjudzj/p/4190878.html
一.原码与补码
在计算机系统中,数值一律用补码来存储(表示)。主要原因:使用补码,可以将符号位和其他位统一处理;同时减法也可按加法来处理。另外,两个补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
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#移位运算符("<<"及">>")的更多相关文章
- java中的移位运算符:<<,>>,>>>总结
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- java 移位运算符
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- C++移位运算符
关于逻辑移位.算术移位可参见迅雷深大笔试题部分.的一道题. 以前看到C++标准上说,移位运算符(<<.>>)出界时的行为并不确定: The behavior is undefi ...
- Java中的移位运算符
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- 移位运算符(JAVA)
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >&g ...
- java中关于移位运算符的demo与总结
首先,移位运算符有三种,其操作类型只支持:byte / short / char / int和long五种. << 左移运算符,表示将左边的操作数的二进制数据向左移动*位,移动后空缺位以0 ...
- (一)《Java编程思想》学习——按位运算符、移位运算符
(第三章) (一)按位运算符 按位逻辑运算符有: “与”(AND) & 1&1=1;1&0=0;0&0=0 “或”(OR) | 1|1=1;1|0=1;0 ...
- java移位运算符具体解释
java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的全部位都左移 ...
- java中的移位运算符:<<,>>,>>>总结(转)
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- C语言移位运算符
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位移位运算符的运算对象 ...
随机推荐
- Java 学习笔记(4)——java 常见类
上次提前说了java中的面向对象,主要是为了使用这些常见类做打算,毕竟Java中一切都是对象,要使用一些系统提供的功能必须得通过类对象调用方法.其实Java相比于C来说强大的另一个原因是Java中提供 ...
- string的常见操作
访问 遍历 不需修改:for(auto c : s) 需要修改:for(auto &c : s) for(decltype(s.size()) i = 0; i < s.size( ...
- STM32的RTC晶振不起振的原因及解决方法
STM32的RTC晶振经常出现不起振的问题,这已经是“业界共识”了.很多人在各种电子论坛上求助类似于“求高手指点!RTC晶振不起振怎么办”的问题,而其答案基本可以概括为“这次高手帮不了你了” 更有阴谋 ...
- 0011 开发者工具(chrome)
此工具是我们的必备工具,以后代码出了问题 我们首先第一反应就是: "按F12"或者是 "shift+ctrl+i" 打开 开发者工具. 菜单: 右击网页空白出- ...
- alpha week 2/2 Scrum立会报告+燃尽图 06
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9803 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶, ...
- 1shell基础,变量,运算符
1shell基础语法 是一个命令解释器,在操作系统的最外层,负责直接与用户进行对话. 我们输入的命令,计算机时不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时把计算机 ...
- linux tomcat安装
一.下载tomcat包 下载tomcat包并上传至服务器中 解压文件: tar -zxvf apache-tomcat-8.5.47.tar.gz 为了后期程序的便于管理,我们还需要将Tomcat复制 ...
- Head First设计模式——组合模式
最近比较忙,有段时间没有更新设计模式的进度了.今天继续学习组合设计模式. 组合模式的例子我们继续延续上篇<Head First设计模式——迭代器模式>的菜单例子,首先声明下迭代器和组合模式 ...
- 「CF1082C」Multi-Subject Competition 解题报告
人生第一篇题解,虽然这道题做的人暂时不多,但我相信它--迟早有一天会发扬光大的!!! 说完废话 步入正题 题意: 传送门 思路: 模拟.枚举 对于每个组里的数字,先排序,然后从一到最大可能的情况,枚举 ...
- 1029 旧键盘 (20 分)C、Java、python
题目描述 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出 肯定坏掉的那些键. 输入描述: 输入在2行中分别给出应该输入的文 ...