面试问题 - 只用位操作在ABAP里实现a+b

用ABAP实现下图的第五种整数相加算法:

实现代码:

REPORT zint.

PARAMETERS: a TYPE int4 OBLIGATORY DEFAULT 100,
            b TYPE int4 OBLIGATORY DEFAULT 100.

DATA: threshold TYPE int4.

FORM add USING a TYPE int4 b TYPE int4 CHANGING cv_result TYPE int4.
  DATA: n TYPE int4 VALUE 0,
        c TYPE int4 VALUE 0.

  DATA: i TYPE int4 VALUE 1.
  DATA: boolean_a TYPE abap_bool,
        boolean_b TYPE abap_bool,
        _a        TYPE int4,
        _b        TYPE int4,
        aa TYPE int4,
        bb TYPE int4.

  DATA(wrapper_one) = zcl_integer=>value_of( 1 ).
  DATA(wrapper_c) = zcl_integer=>value_of( c ).

  aa = a.
  bb = b.
  WHILE i < threshold.
    DATA(wrapper_a) = zcl_integer=>value_of( aa ).
    DATA(wrapper_b) = zcl_integer=>value_of( bb ).
    boolean_a = boolc( wrapper_a->and( wrapper_one )->get_raw_value( ) EQ 1 ).
    boolean_b = boolc( wrapper_b->and( wrapper_one )->get_raw_value( ) EQ 1 ).

    _a = COND int4( WHEN boolean_a EQ abap_true THEN 1 ELSE 0 ).
    _b = COND int4( WHEN boolean_b EQ abap_true THEN 1 ELSE 0 ).
    wrapper_a = zcl_integer=>value_of( _a ).
    wrapper_b = zcl_integer=>value_of( _b ).
    wrapper_c = zcl_integer=>value_of( c ).
    DATA(_n_wrapper) = wrapper_a->xor( wrapper_b )->xor( wrapper_c ).
    DATA(b_or_c) = wrapper_b->or( wrapper_c ).
    DATA(b_and_c) = wrapper_b->and( wrapper_c ).
    DATA(_c_wrapper) = wrapper_a->and( b_or_c )->or( b_and_c ).
    c = _c_wrapper->get_raw_value( ).
    DATA(_n_i0_wrapper) = zcl_integer=>value_of( COND int4( WHEN _n_wrapper->get_raw_value( ) > 0 THEN i ELSE 0 ) ).
    DATA(wrapper_n) = zcl_integer=>value_of( n ).
    n = wrapper_n->or( _n_i0_wrapper )->get_raw_value( ).

    wrapper_a = zcl_integer=>value_of( aa ).
    aa = wrapper_a->shift_right( )->get_raw_value( ).

    wrapper_b = zcl_integer=>value_of( bb ).
    bb = wrapper_b->shift_right( )->get_raw_value( ).

    cv_result = n.

    DATA(wrapper_i) = zcl_integer=>value_of( i ).
    wrapper_i->shift_left( ).

    i = wrapper_i->get_raw_value( ).

  ENDWHILE.

ENDFORM.

START-OF-SELECTION.
  DATA: i TYPE int4.
  threshold = ipow( base = 2 exp = 30 ).
  PERFORM add USING a b CHANGING i.

  WRITE: / i.

算法描述参考我的SCN博客 Just for fun – Implement a + b using pure bitwise operation in ABAP

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏更流畅、简洁的软件开发方式

联动设置

8530
来自专栏杨建荣的学习笔记

not null constraint和check constriant的问题及分析(64天)

oracle的constraint有6类,如下。 但是基于列的constraint主要有 type 为C,P,R,U 接触比较多的。 今天来和大家讨论chec...

37870
来自专栏数据库新发现

Oracle9i新特性-使用DBMS_METADATA包获得对象DDL语句

从Oracle9i开始Oracle提供了一个新的系统包DBMS_METADATA,可以用于提取对象创建的DDL语句。

14720
来自专栏Linyb极客之路

MySQL 索引管理与执行计划

  索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索...

13040
来自专栏Java成神之路

Oracle学习笔记_10_判断是否为日期类型

8840
来自专栏数据分析

SQL Server 性能优化之——重复索引

1. 概述 很多人都知道索引在数据库上的是有利有弊的。像其他主流商业数据库一样SQL Server允许在一个列上重复创建索引。因为SQL Server没有限制创...

35490
来自专栏杨建荣的学习笔记

MySQL和Oracle对比学习之数据字典元数据(r4笔记第33天)

MySQL和Oracle虽然在架构上有很大的不同,但是如果从某些方面比较起来,它们有些方面也是相通的。 毕竟学习的主线是MySQL,所以会从MySQL的角度来对...

30560
来自专栏乐沙弥的世界

避免游标多次遍历

游标在数据库领域被广泛使用,尤其是对于需要将SQL语句返回的数据集进行逐行处理的时候。这为数据处理提供了极大的便利性,然游标的不当 使用从某种程度...

8220
来自专栏AhDung

【SQL】找出行数与自增标识值不相等的表(即有缺行)

原理:遍历所有含自增列的用户表,用sp_spaceused过程分别获取每张表的行数并写入临时表,然后使用IDENT_CURRENT函数获取表的最大标识值,比较二...

12720
来自专栏乐沙弥的世界

Oracle 性能相关常用脚本(SQL)

在缺乏的可视化工具来监控数据库性能的情形下,常用的脚本就派上用场了,下面提供几个关于Oracle性能相关的脚本供大家参考。以下脚本均在Oracle 10g测试通...

13620

扫码关注云+社区

领取腾讯云代金券