黑马程序员技术交流社区

标题: c#中的位移问题 [打印本页]

作者: 王毅    时间: 2013-3-7 23:56
标题: c#中的位移问题
本帖最后由 王毅 于 2013-3-15 20:00 编辑

在C#运算优先级中有位移的运算符号<<    >>   ,这两个运算符主要是用来做什么的
作者: 吕振    时间: 2013-3-8 00:07
二进制计数以单字节为例,比如0x55=0b01010101如果将该数值左移1位,就变成了 0b10101010(最右边这个0是移空了以后补的),这个数值是0xaa从数学上看,左移1位等于乘以2,右移1位等于除以2,然后再取整,移位溢出的丢弃。
作者: 史金阳    时间: 2013-3-8 00:14
貌似很复杂哦 美女 本着复杂问题简单化原则
就是数据转换成二进制的左右移动;右移左补0,左移右补0,后面多出来的部分去掉。

用乘除法去理解位移也可以:

     左位移:相当于乘

             左移1位相当于乘2,左移2位相当于乘4,左移3位相当于乘8,左移4位相当于乘16...类推

     右位移:相当于除

             右移1位相当于除2,右移2位相当于除4,右移3位相当于除8,右移4位相当于除16...类推


作者: 王毅    时间: 2013-3-8 00:32
这两个运算符主要是用于做什么的   
作者: 董华阳    时间: 2013-3-8 19:20
左移运算符 (<<) 将第一个操作数向左 移动第二个操作数指定的位数。第二个操作数的类型必须是 int。
备注:
如果第一个操作数是 int 或 uint(32 位数),则移位数由第二个操作数的低 5 位给 出。
如果第一个操作数 是 long 或 ulong(64 位数),则移位数由第二个操作数的低 6 位给 出。
第一个操作数的高 序位被放弃,低序空位用 0 填充。移位操作从不导致溢出。

右移运算符 (>>) 将第一个操作数向右 移动第二个操作数所指定的位数。
备注:
如果第一个操作数为 int 或 uint(32 位数),则移位数由第二个操作数的低五位给出(第二个操作数 & 0x1f)。
如果第一个操作数为 long 或 ulong(64 位数),则移位数由第二个操作数的 低六位给出(第二个操作数 & 0x3f)。
如果第一个操作数为 int 或 long,则右移位是算术移位(高序空位 设置为符号位)。如果第一个操作数为 uint 或 ulong 类型,则右移位是逻辑移位(高位填充 0)。
用户定义的类型可重载 >> 运算符;第一个操作数的类型必须为用户定义的类型,第二个操作数的类型必须为 int。有关更多信息,请参见 operator。重 载二元运算符时,也会隐式重载相应的赋值运算符(如果有)。



用户定义的类型可重载 << 运算符(请参见 operator); 第一个操作数的类型必须为用户定义的类型,第二个操作数的类型必须为 int。重载二元运算符时, 也会隐式重载相应的赋值运算符(如果有)。


作者: 孔健    时间: 2013-3-9 11:09
王毅 发表于 2013-3-8 00:32
这两个运算符主要是用于做什么的

位移比乘除速度快.对效率要求高,而且满足2的幂次方的乘除运算,可以采用位移的方式进行。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2