这几天要在ABAP中实现 3DES 标准对称加密算法,与其他外部系统进行加密/解密操作。由于ABAP语言中没有 左移 <<、无符号右移 >>>  操作,只能自己实现
思路:
如果移动的位数bit是字节(8位)的整数倍,则直接使用  SHIFT <i> BY p PLACES RIGHT IN BYTE MODE.这样的语句搞定(这样效率会更高),如果非字节整数倍,则需要借助于SET BIT来完成,实现时,要注意整型的字节序格式,本人开发环境是低字节序(低位在前,高位在后),与人的阅读习惯是反的(但要注意的字节里面的是还是高位在前,低位在后),左右位移规则如下(同一种颜色为移动后所在位置):


DATA: BEGIN OF index_map OCCURS 0,
  index_inner TYPE i,
  index TYPE i,
  END OF  index_map .

FORM init .
  CLEAR: index_map[].
  index_map-index_inner = 1.
  index_map-index = 8.
  APPEND index_map.
  index_map-index_inner = 2.
  index_map-index = 7.
  APPEND index_map.
  index_map-index_inner = 3.
  index_map-index = 6.
  APPEND index_map.
  index_map-index_inner = 4.
  index_map-index = 5.
  APPEND index_map.
  index_map-index_inner = 5.
  index_map-index = 4.
  APPEND index_map.
  index_map-index_inner = 6.
  index_map-index = 3.
  APPEND index_map.
  index_map-index_inner = 7.
  index_map-index = 2.
  APPEND index_map.
  index_map-index_inner = 8.
  index_map-index = 1.
  APPEND index_map.
  index_map-index_inner = 9.
  index_map-index = 16.
  APPEND index_map.
  index_map-index_inner = 10.
  index_map-index = 15.
  APPEND index_map.
  index_map-index_inner = 11.
  index_map-index = 14.
  APPEND index_map.
  index_map-index_inner = 12.
  index_map-index = 13.
  APPEND index_map.
  index_map-index_inner = 13.
  index_map-index = 12.
  APPEND index_map.
  index_map-index_inner = 14.
  index_map-index = 11.
  APPEND index_map.
  index_map-index_inner = 15.
  index_map-index = 10.
  APPEND index_map.
  index_map-index_inner = 16.
  index_map-index = 9.
  APPEND index_map.
  index_map-index_inner = 17.
  index_map-index = 24.
  APPEND index_map.
  index_map-index_inner = 18.
  index_map-index = 23.
  APPEND index_map.
  index_map-index_inner = 19.
  index_map-index = 22.
  APPEND index_map.
  index_map-index_inner = 20.
  index_map-index = 21.
  APPEND index_map.
  index_map-index_inner = 21.
  index_map-index = 20.
  APPEND index_map.
  index_map-index_inner = 22.
  index_map-index = 19.
  APPEND index_map.
  index_map-index_inner = 23.
  index_map-index = 18.
  APPEND index_map.
  index_map-index_inner = 24.
  index_map-index = 17.
  APPEND index_map.
  index_map-index_inner = 25.
  index_map-index = 32.
  APPEND index_map.
  index_map-index_inner = 26.
  index_map-index = 31.
  APPEND index_map.
  index_map-index_inner = 27.
  index_map-index = 30.
  APPEND index_map.
  index_map-index_inner = 28.
  index_map-index = 29.
  APPEND index_map.
  index_map-index_inner = 29.
  index_map-index = 28.
  APPEND index_map.
  index_map-index_inner = 30.
  index_map-index = 27.
  APPEND index_map.
  index_map-index_inner = 31.
  index_map-index = 26.
  APPEND index_map.
  index_map-index_inner = 32.
  index_map-index = 25.
  APPEND index_map.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  lshfit_i
*&---------------------------------------------------------------------*
*       整型左移
*----------------------------------------------------------------------*
*      -->I          待位移的数
*      -->PLACES     移几位
*      -->I2         位移后的数
*----------------------------------------------------------------------*
FORM lshfit_i USING i TYPE i places TYPE i i2 TYPE i.
  DATA: start1 TYPE i ,start2 TYPE i.
  DATA: b TYPE n.
  DATA: i3 TYPE i.
  FIELD-SYMBOLS: <i3> TYPE x.

  FIELD-SYMBOLS: <i> TYPE x.
  FIELD-SYMBOLS: <p> TYPE x.
  DATA: _31(4) TYPE x,p TYPE i.
  p = places.
  IF places < 0.
    _31 = '1F000000'.
    ASSIGN p TO <p> CASTING.
    <p> = <p> BIT-AND _31.
  ENDIF.

  i2 = i.
  ASSIGN i2 TO <i> CASTING.

  IF p = 24 OR p = 16 OR p = 8.
    p = p / 8.
    SHIFT <i> BY p PLACES RIGHT IN BYTE MODE.
  ELSE.
    ASSIGN i3 TO <i3> CASTING.
    start1 = 32 - p.

    WHILE  start1 >= 1.
      READ TABLE index_map INDEX start1.
      GET BIT index_map-index OF <i> INTO b.
      IF b = 1.
        start2 = start1 + p.
        READ TABLE index_map INDEX start2.
        SET BIT index_map-index OF <i3> TO b.
      ENDIF.
      start1 = start1 - 1.
    ENDWHILE.
    <i> = <i3>.
  ENDIF.
ENDFORM.                    "lshfit_i

*&---------------------------------------------------------------------*
*&      Form  rshfit_i
*&---------------------------------------------------------------------*
*       整型右移
*----------------------------------------------------------------------*
*      -->I          待位移的数
*      -->PLACES     移几位
*      -->I2         位移后的数
*----------------------------------------------------------------------*
FORM rshfit_i USING i TYPE i places TYPE i i2 TYPE i.
  DATA: start1 TYPE i ,start2 TYPE i.
  DATA: b TYPE n.
  DATA: i3 TYPE i.
  FIELD-SYMBOLS: <i3> TYPE x.
  FIELD-SYMBOLS: <i> TYPE x.
  FIELD-SYMBOLS: <p> TYPE x.
  DATA: _31(4) TYPE x,p TYPE i.
  DATA multiplier TYPE i.

  p = places.
  IF p < 0.
    _31 = '1F000000'.
    ASSIGN p TO <p> CASTING.
    <p> = <p> BIT-AND _31.
  ENDIF.

  i2 = i.

  ASSIGN i2 TO <i> CASTING.

  IF p = 24 OR p = 16 OR p = 8.
    p = p / 8.
    SHIFT <i> BY p PLACES LEFT IN BYTE MODE.
  ELSE.
    IF i >= 0 AND p < 31 .
      multiplier = 2 ** p.
      i2 = i DIV multiplier.
    ELSE.
      ASSIGN i3 TO <i3> CASTING.

      start1 = p + 1.

      WHILE  start1 <= 32.
        READ TABLE index_map INDEX start1.
        GET BIT index_map-index OF <i> INTO b.
        IF b = 1.
          start2 = start1 - p.
          READ TABLE index_map INDEX start2.
          SET BIT index_map-index OF <i3> TO b.
        ENDIF.
        start1 = start1 + 1.
      ENDWHILE.
      <i> = <i3>.
    ENDIF.
  ENDIF.
ENDFORM.                    "rshfit_i

*&---------------------------------------------------------------------*
*&      Form  c2int
*&---------------------------------------------------------------------*
*       字符转整型
*----------------------------------------------------------------------*
*      -->C1         text
*      -->I          text
*----------------------------------------------------------------------*
FORM c2int USING c1 TYPE c i TYPE i.
  FIELD-SYMBOLS <c1> TYPE x.
  FIELD-SYMBOLS: <i> TYPE x.
  ASSIGN c1 TO <c1> CASTING.
  ASSIGN i TO <i> CASTING.
  <i> = <c1>.
ENDFORM.    

*&---------------------------------------------------------------------*
*&      Form  lshfit_c
*&---------------------------------------------------------------------*
*       字符左移
*----------------------------------------------------------------------*
*      -->C1         待位移的字符
*      -->PLACES     移几位
*      -->I          位移后的结果
*----------------------------------------------------------------------*
FORM lshfit_c USING c1 TYPE c places TYPE i i TYPE i.
  PERFORM c2int USING c1 i.
  PERFORM lshfit_i USING i places i.
ENDFORM.                    "lshfit

*&---------------------------------------------------------------------*
*&      Form  rshfit_c
*&---------------------------------------------------------------------*
*       字符右移
*----------------------------------------------------------------------*
*      -->C1         待位移的字符
*      -->PLACES     移几位
*      -->I          位移后的结果
*----------------------------------------------------------------------*
FORM rshfit_c USING c1 TYPE c places TYPE i i TYPE i.
  PERFORM c2int USING c1 i.
  PERFORM rshfit_i USING i places i.
ENDFORM.                    "rshfit_c
 
 

ABAP语言实现 左移 <<、无符号右移 >>> 位移操作的更多相关文章

  1. Java负整数的左移、右移、无符号右移

    转自  Java负整数的左移.右移.无符号右移 Java负整数的左移.右移.无符号右移.正数的位移没有涉及到符号,而且正数的原码.反码.补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆 ...

  2. 原码,反码,补码 与(&) 或(|) 非(~) 异或(^) 左移 << 右移 >> 无符号右移 >>>

    原码 数字在计算机中以二进制表示,8位的字长,最高位是符号位, 正数为0,负数为1.比如,3为0000 0011: -3为1000 0011. 注意,Java中int为32位.3的16进制表示为3,- ...

  3. java的<<左移,>>右移,>>>无符号右移

    >>右移 右移,道在二进制中,假设用一个32位的Int表示一个64,那么高位就都是0,所以当我们把整个二进制数右移,如0100000 >> 2 = 0001000,可以看到右移 ...

  4. java移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

    1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规 ...

  5. 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)

    前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...

  6. [JAVA]移位运算(左移<<,右移>>和无符号右移>>>)

    一.背景知识 整数在内存中是以二进制的形式存在的,而且存的是该整数的补码.最高位代表符号位,正数为0,负数为1 正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和 ...

  7. java移位运算符实验程序:&lt;&lt;(左移)、&gt;&gt;(带符 号右移)和&gt;&gt;&gt;(无符号右移)

    public class txs { static void leftbit(){ int i;               //整型长度为32位                           ...

  8. Java,C 位移运算符 有符号右移>>与无符号右移>>>

    个人博客 地址:https://www.wenhaofan.com/a/20181029232749 有符号右移 正数有符号右移 首先计算4>>2 将4转为二进制 0000 0100 右移 ...

  9. PHP实现无符号右移(js中的 >>>)

    移位包括有符号左移(<<).有符号右移(>>).无符号右移(>>>),其中 js 支持三种移位,PHP只支持前两种移位(没查到第三种),恰好需要PHP进行无符 ...

随机推荐

  1. spark操作Kudu之读 - 使用DataFrame API

    虽然我们可以通过上面显示的KuduContext执行大量操作,但我们还可以直接从默认数据源本身调用读/写API. 要设置读取,我们需要为Kudu表指定选项,命名我们要读取的表以及为表提供服务的Kudu ...

  2. TCP/UDP 协议,和 HTTP、FTP、SMTP,区别及应用场景

    一.OSI 模型 OSI 模型主要作为一个通用模型来做理论分析,而TCP/IP 协议模型是互联网的实际通讯协议,两者一般做映射分析,以下不做严格区分和声明(好吧,比较懒): OSI 整个模型层次大致可 ...

  3. Python交互图表可视化Bokeh:3. 散点图

    散点图 ① 基本散点图绘制② 散点图颜色.大小设置方法③ 不同符号的散点图 1. 基本散点图绘制 import numpy as np import pandas as pd import matpl ...

  4. 不同路径II(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。)

    示例 1: 输入: [   [0,0,0],   [0,1,0],   [0,0,0] ] 输出: 2 解释: 3x3 网格的正中间有一个障碍物. 从左上角到右下角一共有 2 条不同的路径: 1. 向 ...

  5. 线程有gil锁

    gil锁作用: 遇到阻塞( 比如 recv() , accept() )就切换

  6. dfs和bfs的区别

    详见转载博客:https://www.cnblogs.com/wzl19981116/p/9397203.html 1.dfs(深度优先搜索)是两个搜索中先理解并使用的,其实就是暴力把所有的路径都搜索 ...

  7. 高效使用hibernate-validator校验框架

    一.前言 高效.合理的使用hibernate-validator校验框架可以提高程序的可读性,以及减少不必要的代码逻辑.接下来会介绍一下常用一些使用方式. 二.常用注解说明 限制 说明 @Null 限 ...

  8. 调整和删除Win7休眠文件Hiberfil.sys释放C盘

    Hiberfil.sys 是 Windows 休眠功能(Windows Hibernation)将内存数据与会话保存至硬盘.以便计算机断电重新启动后可以快速恢复会话所需的内存镜像文件.在早期版本的 W ...

  9. 安装supset遇到的问题

    1.缺少pyconfig.h文件问题(python3.4) 执行下列两行命令: $sudo apt-get install build-essential cmake $sudo apt-get in ...

  10. asp.net core选项Options模块的笔记

    这篇博客是写给自己看的.已经不止一次看到AddOptions的出现,不管是在.net core源码还是别人的框架里面,都充斥着AddOptions.于是自己大概研究了下,没有深入,因为,我的功力还是不 ...