2016-11-17 59 views
1

我必須做出具有這樣輸出的程序:轉換十進制值來獲得進展分割二元4GL

def var vbit as logical extent 64 initial "false". 
def var x as char form "x(16)" /* to store the decimal input */ 

Input : 2220010000000000 
convert the value into: 

22=00100010 
20=00100000 
01=00000001 
00=00000000 
00=00000000 
00=00000000 
00=00000000 

那麼如果二進制進行排序,輸出將是:

123456789
00100010001000000000000100000000000000000000000000000000 

從這個二進制文件中,像在圖像上更改vbit [x]。

enter image description here

感謝很多答案。

+0

你真的需要處理十進制數嗎?還是INTEGER? –

+0

我的意思是十六進制轉換爲二進制 – meo

回答

1

這是一個簡單的例子,很可能不生產像enviroments可用...

據我知道有沒有內置的函數或方法來創建二進制數。所以我借了函數從這裏: http://knowledgebase.progress.com/articles/Article/P125416

我修改與4位格式返回整數的功能,這會爲這個具體的例子,但當然不是爲更大的二進制數工作。

DEFINE VARIABLE vbit  AS LOGICAL EXTENT 64 NO-UNDO . 
DEFINE VARIABLE cString AS CHARACTER NO-UNDO FORMAT "x(16)". 
DEFINE VARIABLE cBinary AS CHARACTER NO-UNDO. 
DEFINE VARIABLE i  AS INTEGER  NO-UNDO. 

ASSIGN 
    cString = "2220010000000000". 

FUNCTION getBinary RETURNS CHARACTER (INPUT piValue AS INTEGER): 

    DEFINE VARIABLE cReturn AS CHARACTER NO-UNDO . 
    DEFINE VARIABLE iReturn AS INTEGER  NO-UNDO FORMAT "9999". 

    DO WHILE piValue > 0: 
     ASSIGN 
     cReturn = STRING(piValue MOD 2) + cReturn 
     piValue = TRUNCATE(piValue/2, 0) 
     . 
    END. 
    IF cReturn = "" THEN cReturn = "0". 


    iReturn = INTEGER(cReturn). 

    RETURN STRING(iReturn, "9999"). 

END FUNCTION. 

/* Convert the string of integers into a binary format */ 
DO i = 1 TO LENGTH(cString): 
    cBinary = cBinary + getBinary(INTEGER(SUBSTRING(cString, i, 1))). 
END. 

/* Move the binary numbers into the boolean variable */ 
DO i = 1 TO LENGTH(cBinary). 

    IF SUBSTRING(cBinary, i, 1) = "1" THEN 
     vbit[i] = TRUE. 
    ELSE 
     vbit[i] = FALSE. 
END. 

/* Uncomment this to output 
123456789
00100010001000000000000100000000000000000000000000000000 
*/ 
/* 
DISP "123456789" SKIP 
    cBinary FORMAT "x(70)" WITH FRAME fr1 4 DOWN WIDTH 90. 
*/ 

/* Display the boolean variable in the specified format */ 
DISP vbit WITH FRAME fr2 SIDE-LABELS 4 COLUMNS WIDTH 90 25 DOWN. 
+0

非常感謝Jensd先生,它已經工作。 – meo