精华内容
下载资源
问答
  • 按位向右移位运算符

    2013-07-12 11:00:26
    按位向右移位运算符 将 expression1 和 expression2 转换为 32 位整数,并将 expression1 中的所有位向右移动由 expression2 转换所得到的整数指定的位数。移到右端以外的位将被舍去。若要保留原始 expression 的...

    按位向右移位运算符

      将 expression1 expression2 转换为 32 位整数,并将 expression1 中的所有位向右移动由 expression2 转换所得到的整数指定的位数。移到右端以外的位将被舍去。若要保留原始 expression 的符号,则如果 expression1 的最高有效位(最左端的位)为 0,那么左侧的位都填补 0;如果最高有效位为 1,那么左侧的位都填补 1。将一个值右移一位等效于将它除以 2 并舍去余数。

      浮点数通过舍去小数点后面的所有位来转换为整数。正整数转换为无符号的十六进制值,其最大值为 4294967295 0xFFFFFFFF;转换大于最大值的数时,会舍去最高有效位,因此该值仍保持为 32 位。负数通过 2 的补码标记转换为无符号的十六进制值,其最小值为 -2147483648 0x800000000;小于最小值的数转换为精度更高的 2 的补码,同时也会舍去最高有效位。

      由于返回值解释为带符号的 2 的补码数,因此,返回值将是 -2147483648 2147483647 范围中的一个整数。

      操作数

      expression1 : Number - 要向右移位的数字或表达式。

      expression2 : Number - 转换为从 0 31 的整数的数字或表达式。

      返回 Number - 按位运算的结果。

      示例

      下面的示例将 65535 转换为 32 位整数,然后右移 8 位:

      var x:Number = 65535 >> 8; 
      trace(x); // outputs 255

      下面的示例显示上一示例的结果:

      var x:Number = 255;

      四、>>= 按位向右移位并赋值运算符

      expression1 >>= expression2

      此运算符执行按位向右移位运算,并将内容作为结果存储在 expression1 中。

      下面的两个语句是等效的:

      A >>= B; 
      A = (A >> B);

      可用性:Flash Player 5ActionScript 1.0

      操作数

      expression1 : Number - 要向右移位的数字或表达式。

      expression2 : Number - 转换为从 0 31 的整数的数字或表达式。

      返回 Number - 按位运算的结果。

      五、>>> 按位无符号向右移位运算符

      expression1 >>> expression2

      除了不保留原始 expression 的符号外,此运算符与按位向右移位运算符 (>>) 相同,这是因为左侧的位始终用 0 填充。

      浮点数通过舍去小数点后面的所有位来转换为整数。正整数转换为无符号的十六进制值,其最大值为 4294967295 0xFFFFFFFF;转换大于最大值的数时,会舍去最高有效位,因此该值仍保持为 32 位。负数通过 2 的补码标记转换为无符号的十六进制值,其最小值为 -2147483648 0x800000000;小于最小值的数转换为精度更高的 2 的补码,同时也会舍去最高有效位。

      可用性:Flash Player 5ActionScript 1.0

      操作数

      expression1 : Number - 要向右移位的数字或表达式。

      expression2 : Number - 转换为从 0 31 的整数的数字或表达式。

      返回 Number - 按位运算的结果。

      示例

      下面的示例将 -1 转换为 32 位整数并向右移 1 位:

      var x:Number = -1 >>> 1; 
      trace(x); // output: 2147483647

      六、>>>= 按位无符号向右移位并赋值运算符

      expression1 >>>= expression2

      执行无符号按位向右移位运算,并将内容作为结果存储在 expression1 中。下面的两个语句是等效的:

      A >>>= B; 
      A = (A >>> B);

      可用性:Flash Player 5ActionScript 1.0

      操作数

      expression1 : Number - 要向右移位的数字或表达式。

      expression2 : Number - 转换为从 0 31 的整数的数字或表达式。

      返回

      Number - 按位运算的结果。

    展开全文
  • Objective-C位运算符-向右移位运算符

    千次阅读 2011-08-26 14:21:05
    与向左移位运算符比起来,这个向右移位运算符(>>)显得稍微复杂些。从值的低位移出的位将丢失。把无符号的值向右移位,也就是总在左侧也就是高位移入0。对于有符号值而言,左侧移入1还是0依赖于被移动数字的符号,还...
    向左移位运算符比起来,这个向右移位运算符(>>)显得稍微复杂些。从值的低位移出的位将丢失。把
    无符号的值向右移位,也就是总在左侧也就是高位移入0。对于
    有符号值而言,左侧移入1还是0依赖于被移动数字的符号,还取决于该操作在计算机上的实现方式。如果符号位是0(表示该值是正的),不管哪种机器都将移入0。然后,如果符号位是1,那么在一些计算机上移入1,而其他计算机则可能移入0。前一类型的运算符通常称为
    算术右移,而后者通常称为
    逻辑右移

    注意,对于系统使用算术右移还是逻辑右移,千万不要猜测!如果进行此类假设,那么在一个系统上可正确进行有符号右移运算的程序,有可能在其他系统上运行失败。

    两种情况会使计算机产生不可预知的结果:
    第一,试图用大于或等于该数据项的位数将值向左向右移位。例如,计算机用32位表示整数,你要移动32位甚至更多。
    第二,使用负数对值移位。
    展开全文
  • char类型数据向右移位时符号位问题

    千次阅读 2012-03-02 15:11:24
    看来是,VC上运算移位时左边填充0,KEIL C51上运算移位时左边填充的是1. int debug = 0; debug = hex & 0xf0; sendNChar(&debug, 2); KEIL C51下输出ff e0 VC下输出e0 找到这里知道程序...
    首先运行环境是51单片机+KEIL C
    
    最近写一个16进制数据转换成ASCII形式的函数,多次运行发现,当16进制数据高4位大于8时,转换就


    出错。
    最开始出错的程序如下:
    void hex2ascii(char hex, char ascii[])
    {
    	char i = 0;
    	
    	ascii[0] = (hex & 0xf0) >> 4;
    	ascii[1] = hex & 0x0f;
    	
    	sendNChar(ascii, 2);
    	
    	for (i=0; i<=1; i++)
    	{
    		if (ascii[i] >= 0xa)
    		{
    			ascii[i] = ascii[i] - 0xa + 'A';
    		}
    		else
    		{
    			ascii[i] = ascii[i] + '0';
    		}
    	}
    	
    	sendNChar(ascii, 2);
    }


    在KEIL C51环境下,输入0xe3,输出fe 03 2e 33。
    在VC环境下,输出输入0xe3,输出e 3 45 33
    后来多次修改尝试,并分析原因。终于发现原因:hex是char类型,是有符号型,移位左边补符号位1。


    故得fe,ascii[0]=0xfe是负数,小于0xa,故结果=0xfe+'0'=0x2e(溢出后结果)。


    但不对,VC上运行正常呀,再分析
    在VC上,int型占32位
    按照C语言的自动类型转换原理
    hex & 0xf0,分别是char和const int类型,转换成int型0xffffffe3 & 0x000000f0 = 0x000000e0


    看来是,VC上运算移位时左边填充0,KEIL C51上运算移位时左边填充的是1.
    	int debug = 0;
    	debug = hex & 0xf0;
    	sendNChar(&debug, 2);


    KEIL C51下输出ff e0

    VC下输出e0


    找到这里知道程序错误的起因了,但hex & 0xf0处理的原因还不了解。
    先断续调我的51程序。
    这种地方 以后都要用unsigned char类型了,免得不必要的麻烦!

    展开全文
  • 【图像处理】NEON编码4 - 左右移位

    千次阅读 2015-12-17 20:23:29
    向量移位NEON上的移位与标量ARM编码中可能用到的移位非常相似,即每个向量元素的位数均向左或向右移位,出现在每个元素左侧或右侧的位将被删除;它们不能移位至相邻的元素。带符号元素的向量上发生的右移位由指令...

    原文地址

    本文将介绍NEON提供的移位运算,并显示如何利用移位运算在常用颜色深度之间转换影像数据。本系列前期已发布的文章包括:第1部分:加载与存储,第2部分:余数的处理,第3部分:矩阵乘法。

    向量移位

    NEON上的移位与标量ARM编码中可能用到的移位非常相似,即每个向量元素的位数均向左或向右移位,出现在每个元素左侧或右侧的位将被删除;它们不能移位至相邻的元素。

    这里写图片描述

    带符号元素的向量上发生的右移位由指令附加的类型指定,并会将符号扩展至每一个元素。这与ARM编码中可能用到的算术移位相同。应用到无符号向量的移位不会发生符号扩展。

    移位与插入

    NEON也支持通过插入产生移位,使两个不同向量的位相结合。例如,左移位与插入(VSLI)可使源向量的每一个元素均向左移位。每个元素右侧新插入的位就是目标向量中的对应位。

    这里写图片描述

    移位与计算

    最后,NEON还支持向量元素向右移位,并将结果计入到另一个向量中。这种方法对于先在高精度条件下进行临时计算,然后再将结果与低精度计算器相结合的情况非常有用。

    指令修改器

    每个移位指令都能拥有一个或多个修改器。这些修改器并不改变移位运算本身,而是通过调整输入值或输出值,消除偏差或饱和状况,保持一定的范围。共有五种移位修改器:

    • 舍位修改器 (Rounding),以R前缀表示,可以纠正右移时舍位导致的偏差。
    • 窄修改器(Narrow),以N后缀表示,可以让结果中每个元素的位数减半。它代表Q(128位)源和D(64位)目标寄存器。
    • 长修改器(Long),以L后缀表示,可以让结果中每个元素的位数加倍。它代表D源和Q目标寄存器。
    • 饱和修改器(Saturating),以Q前缀表示,可以在最大和最小可表范围内设置每个结果元素,前提是结果未超出该范围。向量的位数和符号类型可用于确定饱和范围。
    • 无符号饱和修改器 (Unsigned Saturating),以Q前缀和U后缀表示,与饱和修改器类似,但在进行带符号或无符号输入时,结果将在无符号范围内表现为饱和。

    这些修改器的部分组合并未表现出有用的运算,因此NEON也没有提供相应指令。例如,饱和右移位(应称为VQSHR)其实就毫无必要,因为右移位只会让结果变得更小,因而值根本无法超出有效范围。

    可用移位表

    NEON提供的所有移位指令均在下表中列出。它们根据先前提到的修改器进行排列。如果你还是不太确定修改器各个字母代表的含义,请利用下表选择需要的指令。

    这里写图片描述

    示例:转换颜色深度

    颜色深度之间的转换是图形处理中经常需要的运算。通常,输入或输出数据都是RGB565 16位颜色格式,但RGB888格式的数据处理起来更为方便。对于NEON而言尤其如此,因为它无法为RGB565这样的数据类型提供本机支持。

    这里写图片描述

    但是,NEON仍然可以有效地处理RGB565数据,上文中介绍的向量移位便提供了处理方法。

    从565到888

    首先,我们来看如何将RGB565转换为RGB888。假设寄存器q0中有8个16位像素,我们想要在d2、d3和d4这三个寄存器中将红色、绿色和蓝色分离成8位的元素。

    这里写图片描述

    每个指令的效果都在上面备注中做了描述,但总而言之,每个通道上执行的运算为:
    利用移位推掉元素任意一端的位数,清除相邻通道的颜色数据。
    使用第二次移位将颜色数据放置到每个元素最重要的位上,并缩短位数将元素大小从16位减至8位。
    请注意在这个顺序中使用元素大小来确定8位和16位元素的位置,以进行部分掩码运算。

    一个小问题

    你可能会注意到,如果使用上述代码转换到RGB888格式,白色显得不够白。这是因为,对于每个通道而言,最低的2或3位是零,而不是1;白色在RGB565中表示为(0x1F, 0x3F, 0x1F),而在RGB888中,却变成了 (0xF8, 0xFC, 0xF8)。这可以通过移位来解决,将部分最重要的位插入到低位。

    从888到565

    现在,我们来看反向运算,即从RGB888转换为RGB565。这里,我们假设RGB888数据为上述代码产生的格式;在d0、d1和d2这三个寄存器上,每个寄存器均包含每种颜色的8个元素。结果将存储为q2格式的8个16位RGB565元素。

    这里写图片描述

    同样,每个指令的详细说明在备注中列出,但总而言之,对于每个通道而言:

    • 将每个元素的长度扩展至16位,并将颜色数据移至最重要的位上。
    • 使用插入右移位,将每个颜色通道放置到结果寄存器中。

    结论

    NEON提供的强大的移位指令范围让你能够:

    • 利用舍入和饱和,通过二次幂快速进行向量的除法和乘法运算。
    • 通过移位将一个向量位复制到另一个向量位。
    • 在高精度条件下进行临时计算,并在低精度条件下计算结果。

    Martyn是处理器领域的资深软件工程师,已在ARM工作了近10年。他主要负责改善ARM平台上软件的性能和体验。他对使用汇编语言和SIMD实现软件优化非常感兴趣,尤其是在图形和多媒体领域。

    展开全文
  • ‘>>>’ 单纯将数位向右移动,其结果不考虑数学意义,进行数字拆分合并时,采用纯正的右移动 面试案例:替代2的整数倍乘法,使用采用数学移位! ​ n * 32 可以替换为 (n ) ​ n / 2 可以替换为 (n >> 1)...
  • 即将1010(2进制)向右移位3次,空位由0填充,变为0001(2进制),转为十进制为1 注:溢出的部分不再考虑 可以将右移位操作看做整除操作,结果取整数,如10>>2等价于10/2^3=1 二、数据转换时的溢出问题 将大范围...
  • 2. 右移位 符号:>> 逻辑移位:左边移入的位用0填充 算术移位:左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样能够保持原数的正 负形式不变。 例如:10010110...
  • 循环右移位举例

    千次阅读 2014-11-09 23:40:51
    循环移位。要求将a进行循环移位,将a循环移n位
  • 移位运算就是对二进制进行有规律低移位移位运算可以设计很多奇妙的效果,在图形图像编程中应用广泛。 “<<”运算符 “<<”运算符执行左移位运算。...把数字 5 左移动 2 位,则返回值为 20。 c...
  • 负数右移位

    2018-09-20 07:53:24
    默认的情况下,右移的结果是下取整的。比如,-3&gt;&gt;1, 移位的时候结果是 -2,而不是 -1;合理的结果应该是-1(取靠近0的整数值)。下面的代码展示了获得合理的结果的一个技巧: #include &lt;...
  • 带符号右移位 分析:num&gt;&gt; n (1)相当于num(num的二进制)向右移动n位。 (2)正数移位:右边(低位)移出部分,直接舍弃,左边(高位)移入部分全部补0。(正数的符号为是0)  负数移位:...
  • 运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1. 语法格式: 需要移位的数字 >> 移位的次数packagecom.zzwx.test.shifting; ...
  • Java位运算学习 左移位 右移位

    千次阅读 2019-02-26 16:58:10
    Java中的位操作符有: ...:右移位运算符。 &lt;&lt;&lt;:无符号右移运算符。 与或非异或比较简单。 //按位与( &amp; ) System.out.println(5 &amp; 7);//输出为5 ...
  • 左移位、右移位>>、不带符号右移位>>>的区别

    万次阅读 多人点赞 2019-03-03 16:01:37
    public static void main(String args[]) { Integer integer = -1073741826; System.out.println(integer); System.out.println(Integer.toBinaryS...
  • 移位运算符也针对二进制的“位”,它主要包括:左移位运算符(>>)、带符号的右移位运算符(>>)。   1.左移运算符 左移运算符用“ public class data17 { public static void main(String[] args) { int a=2; ...
  • c语言左移位 右移位

    2012-06-18 09:51:15
    先说左移,左移就是把一个数的所有位都左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,...
  • 合并两个有序数组_向右循环移位

    千次阅读 2014-06-05 21:21:06
     解答此题可以用向右(左)循环换位合并的思想,先用二分搜索查找a[0]在数组a[k:n-1]中的位置p使得a[p][0][p+1].然后数组a[0:p]向右循环换位p-k+1个位置,换位完成后,数组a[0]及其左边的元素都排序好的元素。对剩下...
  • java 左右移位运算

    2015-08-01 17:01:00
     num 指定要移位值value 移动的位数。  左移的规则只记住一点:丢弃最高位,0补最低位  如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了332=1位...
  • )、右移位运算符(>>>)、带符号的右移位运算符(>>)。1.左移运算符左移运算符用“<<”表示,是将运算符左边的对象,左移动运算符右边指定的位数,并且在低位补零。其实,左移n 位,就...
  • 这些运算符用于向左或向右移位数字的位,从而分别将数字乘以或除以2。当我们必须将数字乘以或除以二时,可以使用它们。一般格式 - <>>,带符号的右移运算符:将数字的位向右移位,并在剩余的空位上填充0。...
  • led流水灯左右移位

    2019-12-10 22:44:29
    #include "reg52.h" #include "intrins.h" typedef unsigned int u16 ; # define led P2 void delay ( u16 ...向右移位 delay ( 50000 ) ; } } }
  • 移位运算符也针对二进制的“位”,它主要包括:左移位运算符(>>)、带符号的右移位运算符(>>)。   1.左移运算符 左移运算符用“ public class data17 { public static void main(String[] args) {...
  • 目录 背景 ...环形移位寄存器(右移) Verilog HDL描述 测试代码 仿真波形图 ISE综合 背景 之所以单独把这个简单的东西拿出来,就是因为这个东西我可能要用到,不能眼高手低,以为简单就一...
  • 当你通过搜索逻辑,算术移位运算的时候,一直寻找资料,只不过可能你没有找到满意的回答,看到这,你大概率可以结束你的搜索过程了。 这里先说一句很重要的话: 正数的原码,反码,补码三者相同。 负数的反码就是该...
  • 逻辑右移:向右移位时将右边移出的低位丢弃,将左边空出的高位补0 算数移位: 算数左移:向左移位时将左边移出的高位丢弃,将右边空出的低位补0 算数右移:向右移位时将右边移出的低位丢弃,将左边空出的高位补0,...
  • 二进制的左右移位运算

    万次阅读 2017-01-16 20:35:51
    移位运算符:最重要的一点,虽然数字存贮在计算机内存中是以2进制的补码形式,但是运用移位运算符时是对源码进行的。 ←移位运算符:高位舍弃,低位补0(负数与正数的运算是一样的) 例:int a=-10,g. g=a →...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,814
精华内容 13,125
关键字:

向右移位