266 lines
6.3 KiB
ABAP
266 lines
6.3 KiB
ABAP
report z_bitwise_operations.
|
|
|
|
class hex_converter definition.
|
|
public section.
|
|
class-methods:
|
|
to_binary
|
|
importing
|
|
hex_value type x
|
|
returning
|
|
value(binary_value) type string,
|
|
|
|
to_decimal
|
|
importing
|
|
hex_value type x
|
|
returning
|
|
value(decimal_value) type int4.
|
|
endclass.
|
|
|
|
|
|
class hex_converter implementation.
|
|
method to_binary.
|
|
data(number_of_bits) = xstrlen( hex_value ) * 8.
|
|
|
|
do number_of_bits times.
|
|
get bit sy-index of hex_value into data(bit).
|
|
|
|
binary_value = |{ binary_value }{ bit }|.
|
|
enddo.
|
|
endmethod.
|
|
|
|
|
|
method to_decimal.
|
|
decimal_value = hex_value.
|
|
endmethod.
|
|
endclass.
|
|
|
|
|
|
class missing_bitwise_operations definition.
|
|
public section.
|
|
class-methods:
|
|
arithmetic_shift_left
|
|
importing
|
|
old_value type x
|
|
change_with type x
|
|
exporting
|
|
new_value type x,
|
|
|
|
arithmetic_shift_right
|
|
importing
|
|
old_value type x
|
|
change_with type x
|
|
exporting
|
|
new_value type x,
|
|
|
|
logical_shift_left
|
|
importing
|
|
old_value type x
|
|
change_with type x
|
|
exporting
|
|
new_value type x,
|
|
|
|
logical_shift_right
|
|
importing
|
|
old_value type x
|
|
change_with type x
|
|
exporting
|
|
new_value type x,
|
|
|
|
rotate_left
|
|
importing
|
|
old_value type x
|
|
change_with type x
|
|
exporting
|
|
new_value type x,
|
|
|
|
rotate_right
|
|
importing
|
|
old_value type x
|
|
change_with type x
|
|
exporting
|
|
new_value type x.
|
|
endclass.
|
|
|
|
|
|
class missing_bitwise_operations implementation.
|
|
method arithmetic_shift_left.
|
|
clear new_value.
|
|
|
|
new_value = old_value * 2 ** change_with.
|
|
endmethod.
|
|
|
|
|
|
method arithmetic_shift_right.
|
|
clear new_value.
|
|
|
|
new_value = old_value div 2 ** change_with.
|
|
endmethod.
|
|
|
|
|
|
method logical_shift_left.
|
|
clear new_value.
|
|
|
|
data(bits) = hex_converter=>to_binary( old_value ).
|
|
|
|
data(length_of_bit_sequence) = strlen( bits ).
|
|
|
|
bits = shift_left(
|
|
val = bits
|
|
places = change_with ).
|
|
|
|
while strlen( bits ) < length_of_bit_sequence.
|
|
bits = |{ bits }0|.
|
|
endwhile.
|
|
|
|
do strlen( bits ) times.
|
|
data(index) = sy-index - 1.
|
|
|
|
data(current_bit) = bits+index(1).
|
|
|
|
if current_bit eq `1`.
|
|
set bit sy-index of new_value.
|
|
endif.
|
|
enddo.
|
|
endmethod.
|
|
|
|
|
|
method logical_shift_right.
|
|
clear new_value.
|
|
|
|
data(bits) = hex_converter=>to_binary( old_value ).
|
|
|
|
data(length_of_bit_sequence) = strlen( bits ).
|
|
|
|
bits = shift_right(
|
|
val = bits
|
|
places = change_with ).
|
|
|
|
while strlen( bits ) < length_of_bit_sequence.
|
|
bits = |0{ bits }|.
|
|
endwhile.
|
|
|
|
do strlen( bits ) times.
|
|
data(index) = sy-index - 1.
|
|
|
|
data(current_bit) = bits+index(1).
|
|
|
|
if current_bit eq `1`.
|
|
set bit sy-index of new_value.
|
|
endif.
|
|
enddo.
|
|
endmethod.
|
|
|
|
|
|
method rotate_left.
|
|
clear new_value.
|
|
|
|
data(bits) = hex_converter=>to_binary( old_value ).
|
|
|
|
bits = shift_left(
|
|
val = bits
|
|
circular = change_with ).
|
|
|
|
do strlen( bits ) times.
|
|
data(index) = sy-index - 1.
|
|
|
|
data(current_bit) = bits+index(1).
|
|
|
|
if current_bit eq `1`.
|
|
set bit sy-index of new_value.
|
|
endif.
|
|
enddo.
|
|
endmethod.
|
|
|
|
|
|
method rotate_right.
|
|
clear new_value.
|
|
|
|
data(bits) = hex_converter=>to_binary( old_value ).
|
|
|
|
bits = shift_right(
|
|
val = bits
|
|
circular = change_with ).
|
|
|
|
do strlen( bits ) times.
|
|
data(index) = sy-index - 1.
|
|
|
|
data(current_bit) = bits+index(1).
|
|
|
|
if current_bit eq `1`.
|
|
set bit sy-index of new_value.
|
|
endif.
|
|
enddo.
|
|
endmethod.
|
|
endclass.
|
|
|
|
|
|
start-of-selection.
|
|
data:
|
|
a type x length 4 value 255,
|
|
b type x length 4 value 2,
|
|
result type x length 4.
|
|
|
|
write: |a -> { a }, { hex_converter=>to_binary( a ) }, { hex_converter=>to_decimal( a ) }|, /.
|
|
|
|
write: |b -> { b }, { hex_converter=>to_binary( b ) }, { hex_converter=>to_decimal( b ) }|, /.
|
|
|
|
result = a bit-and b.
|
|
write: |a & b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
result = a bit-or b.
|
|
write: |a \| b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
result = a bit-xor b.
|
|
write: |a ^ b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
result = bit-not a.
|
|
write: |~a -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
missing_bitwise_operations=>arithmetic_shift_left(
|
|
exporting
|
|
old_value = bit-not a
|
|
change_with = b
|
|
importing
|
|
new_value = result ).
|
|
write: |~a << b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
missing_bitwise_operations=>arithmetic_shift_right(
|
|
exporting
|
|
old_value = bit-not a
|
|
change_with = b
|
|
importing
|
|
new_value = result ).
|
|
write: |~a >> b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
missing_bitwise_operations=>logical_shift_left(
|
|
exporting
|
|
old_value = a
|
|
change_with = b
|
|
importing
|
|
new_value = result ).
|
|
write: |a <<< b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
missing_bitwise_operations=>logical_shift_right(
|
|
exporting
|
|
old_value = bit-not a
|
|
change_with = b
|
|
importing
|
|
new_value = result ).
|
|
write: |~a >>> b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
missing_bitwise_operations=>rotate_left(
|
|
exporting
|
|
old_value = bit-not a
|
|
change_with = b
|
|
importing
|
|
new_value = result ).
|
|
write: |~a rotl b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|
|
|
|
missing_bitwise_operations=>rotate_right(
|
|
exporting
|
|
old_value = a
|
|
change_with = b
|
|
importing
|
|
new_value = result ).
|
|
write: |a rotr b -> { result }, { hex_converter=>to_binary( result ) }, { hex_converter=>to_decimal( result ) }|, /.
|