-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBinary.cls
More file actions
166 lines (138 loc) · 5.35 KB
/
Copy pathBinary.cls
File metadata and controls
166 lines (138 loc) · 5.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*------------------------------------------------------------------------
File : Binary.cls
Purpose :
Syntax :
Description : Binary bitwise operations for INTEGER and INT64
Author(s) : Gabriel Hautclocq
Created : Fri Mar 28 14:55:58 CET 2014
Notes :
----------------------------------------------------------------------*/
USING Progress.Lang.*.
CLASS Binary:
/*
Shifts an integer bits to the left
*/
METHOD PUBLIC STATIC INTEGER BIN_LSHIFT ( INPUT pr_in_a AS INTEGER, INPUT pr_in_b AS INTEGER) :
RETURN INTEGER( pr_in_a * EXP( 2, pr_in_b ) ).
END METHOD.
METHOD PUBLIC STATIC INT64 BIN_LSHIFT64( INPUT pr_in_a AS INT64 , INPUT pr_in_b AS INT64 ) :
RETURN INT64 ( pr_in_a * EXP( 2, pr_in_b ) ).
END METHOD.
/*
Shifts an integer bits to the right
*/
METHOD PUBLIC STATIC INTEGER BIN_RSHIFT ( INPUT pr_in_a AS INTEGER, INPUT pr_in_b AS INTEGER) :
RETURN INTEGER( TRUNCATE( pr_in_a / EXP( 2, pr_in_b ), 0 ) ).
END METHOD.
METHOD PUBLIC STATIC INT64 BIN_RSHIFT64( INPUT pr_in_a AS INT64 , INPUT pr_in_b AS INT64 ) :
RETURN INT64 ( TRUNCATE( pr_in_a / EXP( 2, pr_in_b ), 0 ) ).
END METHOD.
/*
BIN_AND - Binary AND between two integers
INPUT pr_in_a AS INTEGER - first operand
INPUT pr_in_b AS INTEGER - second operand
note : (myval & 255) is the same as (myval mod 256)
*/
METHOD PUBLIC STATIC INTEGER BIN_AND ( pr_in_a AS INTEGER, pr_in_b AS INTEGER):
DEFINE VARIABLE in_res AS INTEGER NO-UNDO INITIAL 0.
DEFINE VARIABLE in_i AS INTEGER NO-UNDO.
DO in_i = 1 TO 32:
IF GET-BITS(pr_in_a, in_i, 1) + GET-BITS(pr_in_b, in_i, 1) >= 2 THEN
DO :
PUT-BITS( in_res, in_i, 1 ) = 1.
END.
END.
RETURN in_res.
END METHOD.
METHOD PUBLIC STATIC INT64 BIN_AND64( pr_in_a AS INT64 , pr_in_b AS INT64 ):
DEFINE VARIABLE in_res AS INT64 NO-UNDO INITIAL 0.
DEFINE VARIABLE in_i AS INT64 NO-UNDO.
DO in_i = 1 TO 32:
IF GET-BITS(pr_in_a, in_i, 1) + GET-BITS(pr_in_b, in_i, 1) >= 2 THEN
DO :
PUT-BITS( in_res, in_i, 1 ) = 1.
END.
END.
RETURN in_res.
END METHOD.
/*
BIN_OR - Binary OR between two integers
INPUT pr_in_a AS INTEGER - first operand
INPUT pr_in_b AS INTEGER - second operand
*/
METHOD PUBLIC STATIC INTEGER BIN_OR ( INPUT pr_in_a AS INTEGER, INPUT pr_in_b AS INTEGER ):
DEFINE VARIABLE in_res AS INTEGER NO-UNDO INITIAL 0.
DEFINE VARIABLE in_i AS INTEGER NO-UNDO.
DO in_i = 1 TO 32:
IF GET-BITS( pr_in_a, in_i, 1 ) + GET-BITS( pr_in_b, in_i, 1 ) >= 1 THEN
DO :
PUT-BITS( in_res, in_i, 1 ) = 1.
END.
END.
RETURN in_res.
END METHOD.
METHOD PUBLIC STATIC INT64 BIN_OR64( INPUT pr_in_a AS INT64 , INPUT pr_in_b AS INT64 ):
DEFINE VARIABLE in_res AS INT64 NO-UNDO INITIAL 0.
DEFINE VARIABLE in_i AS INT64 NO-UNDO.
DO in_i = 1 TO 32:
IF GET-BITS( pr_in_a, in_i, 1 ) + GET-BITS( pr_in_b, in_i, 1 ) >= 1 THEN
DO :
PUT-BITS( in_res, in_i, 1 ) = 1.
END.
END.
RETURN in_res.
END METHOD.
/*
BIN_XOR - Binary XOR between two integers
INPUT pr_in_a AS INTEGER - first operand
INPUT pr_in_b AS INTEGER - second operand
*/
METHOD PUBLIC STATIC INTEGER BIN_XOR ( INPUT pr_in_a AS INTEGER, INPUT pr_in_b AS INTEGER ) :
DEFINE VARIABLE in_res AS INTEGER NO-UNDO INITIAL 0.
DEFINE VARIABLE in_i AS INTEGER NO-UNDO.
DO in_i = 1 TO 32:
IF GET-BITS( pr_in_a, in_i, 1) + GET-BITS( pr_in_b, in_i, 1 ) = 1 THEN
DO :
PUT-BITS( in_res, in_i, 1 ) = 1.
END.
END.
RETURN in_res.
END METHOD.
METHOD PUBLIC STATIC INT64 BIN_XOR64( INPUT pr_in_a AS INT64 , INPUT pr_in_b AS INT64 ) :
DEFINE VARIABLE in_res AS INT64 NO-UNDO INITIAL 0.
DEFINE VARIABLE in_i AS INT64 NO-UNDO.
DO in_i = 1 TO 32:
IF GET-BITS( pr_in_a, in_i, 1) + GET-BITS( pr_in_b, in_i, 1 ) = 1 THEN
DO :
PUT-BITS( in_res, in_i, 1 ) = 1.
END.
END.
RETURN in_res.
END METHOD.
/*
BIN_NOT - Binary NOT of an integer (reverses the bits of the integer)
INPUT pr_in_a AS INTEGER - operand to negate
*/
METHOD PUBLIC STATIC INTEGER BIN_NOT ( INPUT pr_in_a AS INTEGER ) :
DEFINE VARIABLE in_res AS INTEGER NO-UNDO INITIAL 0.
DEFINE VARIABLE in_i AS INTEGER NO-UNDO.
DO in_i = 1 TO 32:
IF GET-BITS( pr_in_a, in_i, 1) = 0 THEN
DO :
PUT-BITS( in_res, in_i, 1 ) = 1.
END.
END.
RETURN in_res.
END METHOD.
METHOD PUBLIC STATIC INT64 BIN_NOT64( INPUT pr_in_a AS INT64 ) :
DEFINE VARIABLE in_res AS INT64 NO-UNDO INITIAL 0.
DEFINE VARIABLE in_i AS INT64 NO-UNDO.
DO in_i = 1 TO 32:
IF GET-BITS( pr_in_a, in_i, 1) = 0 THEN
DO :
PUT-BITS( in_res, in_i, 1 ) = 1.
END.
END.
RETURN in_res.
END METHOD.
END CLASS.