左右移位运算符(<<和>>)已在C++中可用.但是,我无法找到如何执行循环移位或旋转操作.
如何执行"向左旋转"和"向右旋转"等操作?
在这里向右旋转两次
Initial --> 1000 0011 0100 0010
Run Code Online (Sandbox Code Playgroud)
应该导致:
Final --> 1010 0000 1101 0000
Run Code Online (Sandbox Code Playgroud)
一个例子会有所帮助.
(编者注:如果旋转计数为零,许多常见的表达方式在C中旋转会受到未定义的行为的影响,或者编译为不止一个旋转机器指令.这个问题的答案应记录最佳实践.)
我在微处理器类中,我们在飞思卡尔CodeWarrior中使用汇编语言来编程68HCS12微控制器.本周我们的任务是反转一个字节,所以如果字节是00000001,输出将是10000000,或者是00101011到11010100.我们必须使用汇编语言,并被告知我们可以使用旋转和移位(但不限于! )完成这项任务.我真的不知道应该从哪里开始.
我记得在集会课上,我们学习了m68k处理器,你可以做3种转换.线性移位,循环移位和带有延伸的圆形移位.
最后一个,带有extend的循环移位,基本上是向左或向右旋转所有位,但它将最外面的位置放到一个延伸位,然后再将它移动到开头(如果你再次移动1).
我画了一张小图:
基本上,在循环移位中使用第33位,但当然不会出现在32位字中.第33位是处理器的X标志,代表扩展.你可以很容易地使用任何状态标志,例如进位标志,但我想摩托罗拉人想要保留那个标志,这样它就不会被覆盖,以防万一你需要进行正常职责的进位标志.一些算法也需要用extend进行旋转.
无论如何,使用extend旋转的目的是什么?它是干什么用的?需要什么?看起来很奇怪.为什么世界上你需要第33位?
我读过这个和这个,两个相关的问题,但他们并没有谈及该循环移位与延伸.
我知道正常班次的一些用途.基本上除以2,或测试可分性,并置换随机性位.类似的东西.但是我想不出为什么你需要在旋转中插入一些扩展位而不会在结果中出现.
编辑:我对它的任何使用感兴趣,无论是现代的还是旧的,如果它在m68k上都无关紧要.m68k只是我遇到它的第一个位置(我从来没有在那里使用它).
我对实际应用感兴趣,即使它们已不符合现代标准。
关于ROL和ROR,这里也有类似的问题,但对于RCL / RCR并没有真正回答。
我可以为RCL,带有操作数1的RCR提出一些应用程序(即,对于某些LFSR),但是我想不出任何带有非1操作数的明智的应用程序。
有人能启发我吗?
PS示例代码非常受欢迎。
更新1:如Peter Cordes以下注释中所述,一个(非常明显的)应用程序是shrd / shld。(IIRC rcl / rcr指令已经存在于8080中)
也许上面的“非1”不是很清楚,但是请记住,我对用法最感兴趣,其中操作数是!= 1(RC(L|R) REG, cc等于> 1或== cl)。
当我遇到这个功能时,我正在阅读SysUtils:
function ALR: Pointer;
var
LibModule: PLibModule;
begin
if MainInstance <> 0 then
Result := Pointer(LoadResource(MainInstance, FindResource(MainInstance, 'DVCLAL',
RT_RCDATA)))
else
begin
Run Code Online (Sandbox Code Playgroud)
之后,我搜索了什么是DVCLAL,我发现了这个问题.
Delphi编译器发送给DVCLAL资源的所有可能签名是什么?
循环左进位和循环右进位指令有哪些实际用途?
在我的汇编课上,我们无法想出一个有用的好例子。