Kbase 18648: Functions that Implement Bit Manipulation (BINARY AND OR)
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  28/04/1999 |
|
Functions that Implement Bit Manipulation (BINARY AND OR)
Title: Functions that Implement Bit Manipulation (BINARY AND OR
KnowledgeBase Number: 18648
Creation Date: 10-MAR-99
Modified Date: 28-APR-99
This document applies to: All Platforms
Version and Release Number: 8.2+ (can convert for earlier versions)
Summary:
The following functions are implemented in the code shown below:
- Convert a signed integer into an unsigned integer
- Convert an unsigned integer into a signed integer
- Do a bitwise AND of two integers
- Do a bitwise OR of two integers
Step by step details:
FUNCTION IntToUnsignedInt RETURNS DECIMAL
(INPUT intOperand AS INTEGER):
DEFINE VARIABLE decUnsignedInt AS DECIMAL NO-UNDO.
ASSIGN decUnsignedInt = intOperand.
IF intOperand < 0 THEN
ASSIGN decUnsignedInt = EXP(2, 32) + decUnsignedInt.
RETURN decUnsignedInt.
END FUNCTION.
FUNCTION UnsignedIntToInt RETURNS INTEGER
(INPUT decOperand AS DECIMAL):
DEFINE VARIABLE intSignedInt AS INTEGER NO-UNDO.
IF decOperand < EXP(2, 31) THEN
ASSIGN intSignedInt = decOperand.
ELSE
ASSIGN intSignedInt = decOperand - EXP(2, 32).
RETURN intSignedInt.
END FUNCTION.
FUNCTION BinaryAnd RETURNS INTEGER
(INPUT intOperand1 AS INTEGER, INPUT intOperand2 AS INTEGER):
DEFINE VARIABLE decValue AS DECIMAL NO-UNDO INITIAL 0.
DEFINE VARIABLE decLoop AS DECIMAL NO-UNDO.
DEFINE VARIABLE decOperand1 AS DECIMAL NO-UNDO.
DEFINE VARIABLE decOperand2 AS DECIMAL NO-UNDO.
ASSIGN decLoop = EXP(2, 31)
decOperand1 = IntToUnsignedInt(intOperand1)
decOperand2 = IntToUnsignedInt(intOperand2).
DO WHILE decLoop > 0.5:
ASSIGN decValue = decValue + decLoop
WHEN decOperand1 >= decLoop AND decOperand2 >= decLoop
decOperand1 = decOperand1 - decLoop
WHEN decOperand1 >= decLoop
decOperand2 = decOperand2 - decLoop
WHEN decOperand2 >= decLoop
decLoop = decLoop / 2.
END.
RETURN UnsignedIntToInt(decValue).
END FUNCTION.
FUNCTION BinaryOr RETURNS INTEGER
(INPUT intOperand1 AS INTEGER, intOperand2 AS INTEGER):
DEFINE VARIABLE decValue AS DECIMAL NO-UNDO INITIAL 0.
DEFINE VARIABLE decLoop AS DECIMAL NO-UNDO.
DEFINE VARIABLE decOperand1 AS DECIMAL NO-UNDO.
DEFINE VARIABLE decOperand2 AS DECIMAL NO-UNDO.
ASSIGN decLoop = EXP(2, 31)
decOperand1 = IntToUnsignedInt(intOperand1)
decOperand2 = IntToUnsignedInt(intOperand2).
DO WHILE decLoop > 0.5:
ASSIGN decValue = decValue + decLoop
WHEN decOperand1 >= decLoop OR decOperand2 >= decLoop
decOperand1 = decOperand1 - decLoop
WHEN decOperand1 >= decLoop
decOperand2 = decOperand2 - decLoop
WHEN decOperand2 >= decLoop
decLoop = decLoop / 2.
END.
RETURN UnsignedIntToInt(decValue).
END FUNCTION.