If a > b, return 1,
if a = b, return 0,
if a < b, return -1
Binary format of 6: 0110
Binary format of 5: 0101
0110 & 0010 = 10 which <> 0.
0101 & 0010 = 0
Binary format of 4: 0100
Binary format of 3: 0011
0100 & 0100 = 0100 which <> 0
0011 & 0100 = 0
function compare(a,b){
var diff = a ^ b;
if( diff == 0)
return 0;
diff = diff | ( diff >> 1 );
diff |= diff >> 2;
diff |= diff >> 4;
diff |= diff >> 8;
diff |= diff >> 16;
diff ^= diff >> 1;
return ( a & diff )? 1:-1;
}
console.log(compare(1,2));
console.log(compare(3,2));
console.log(compare(300,2));
console.log(compare(3000,2));
console.log(compare(3000,3000));
console.log(compare(3000,3001));
public static int compare(int a, int b){
int diff = a ^ b;
if( diff == 0)
return 0;
diff = diff | ( diff >> 1 );
diff |= diff >> 2;
diff |= diff >> 4;
diff |= diff >> 8;
diff |= diff >> 16;
diff ^= diff >> 1;
return ( (a & diff) == 0 ) ? -1 : 1;
}
System.out.println(compare(1,2));
System.out.println(compare(3,2));
System.out.println(compare(300,2));
System.out.println(compare(3000,2));
System.out.println(compare(3000,3000));
System.out.println(compare(3000,3001));
METHOD compare.
DEFINE shift_right.
lv_diff = a->get_raw_value( ).
a->shift_right( &1 ).
lo_diff = zcl_integer=>value_of( lv_diff ).
a = lo_diff->or( a ).
END-OF-DEFINITION.
DATA(a) = zcl_integer=>value_of( iv_a ).
DATA(b) = zcl_integer=>value_of( iv_b ).
DATA: lv_diff TYPE int4,
lo_diff TYPE REF TO zcl_integer.
a = a->xor( b ).
IF a->get_raw_value( ) IS INITIAL.
rv_result = 0.
RETURN.
ENDIF.
shift_right 1.
shift_right 2.
shift_right 4.
shift_right 8.
shift_right 16.
lv_diff = a->get_raw_value( ).
a->shift_right( 1 ).
lo_diff = zcl_integer=>value_of( lv_diff ).
a = lo_diff->xor( a ).
DATA(lo_origin_a) = zcl_integer=>value_of( iv_a ).
rv_result = zcl_integer=>value_of( lo_origin_a->and( a )->get_raw_value( ) )->get_raw_value( ).
rv_result = COND #( WHEN rv_result IS INITIAL THEN -1 ELSE 1 ).
ENDMETHOD.
WRITE:/ zcl_comparator=>compare( iv_a = 1 iv_B = 2 ).
WRITE:/ zcl_comparator=>compare( iv_a = 3 iv_B = 2 ).
WRITE:/ zcl_comparator=>compare( iv_a = 300 iv_B = 2 ).
WRITE:/ zcl_comparator=>compare( iv_a = 3000 iv_B = 2 ).
WRITE:/ zcl_comparator=>compare( iv_a = 3000 iv_B = 3000 ).
WRITE:/ zcl_comparator=>compare( iv_a = 3000 iv_B = 3001 ).
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
3 | |
3 | |
3 | |
2 | |
2 | |
2 | |
2 | |
1 | |
1 | |
1 |