面试问题 - 只用位操作在 ABAP 里实现 a+b
发布于: 2021 年 05 月 23 日

用 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 的原创技术文章,请关注公众号"汪子熙":
 
 划线
评论
复制
发布于: 2021 年 05 月 23 日阅读数: 6
版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/ea35e17081a3e204eda7450eb】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。

Jerry Wang
关注
个人微信公众号:汪子熙 2017.12.03 加入
SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。











 
    
评论