十进制转二进制 2 的补码 oracle sql

decimal to binary 2's complement oracle sql

将数字转换为二进制 2 的补码-

我在oracle的一列中有样本编号table - 1647795600

我想将其转换为二进制 2 的补码。

预期输出-01100010001101110101110110010000

参考 link - https://www.rapidtables.com/convert/number/decimal-to-binary.html

我找到了一个对测试样本号有效的声明- select reverse(max(replace(sys_connect_by_path(mod(trunc(&N/power(2,level-1)),2),' '),' ', ''))) 垃圾桶 从双 按级别连接 <= 32 ;

但可能不是完全有用,需要 modify 才能从 table 读取。

您可以创建函数:

CREATE FUNCTION dec_to_2c_bin(
  value IN PLS_INTEGER,
  width IN PLS_INTEGER := 32
) RETURN VARCHAR2 DETERMINISTIC
IS
  v_unsigned PLS_INTEGER;
  v_binary   VARCHAR2(201);
BEGIN
  IF value < 0 THEN
    v_unsigned := -1 - value;
  ELSE
    v_unsigned := value;
  END IF;
  WHILE ( v_unsigned > 0 ) LOOP
     v_binary := MOD(v_unsigned, 2) || v_binary;
     v_unsigned := TRUNC( v_unsigned / 2 );
  END LOOP;
  IF LENGTH(v_binary) > width - 1 THEN
    RAISE_APPLICATION_ERROR(-20000, 'The value is too large.');
  END IF;
  v_binary := LPAD(v_binary, width, '0');
  IF value < 0 THEN
    RETURN TRANSLATE(v_binary, '01', '10');
  ELSE
    RETURN v_binary;
  END IF;
END;
/

然后对于示例数据:

CREATE TABLE table_name (value) AS
SELECT +1647795600 FROM DUAL UNION ALL
SELECT -1647795600 FROM DUAL UNION ALL
SELECT       25143 FROM DUAL UNION ALL
SELECT       +3142 FROM DUAL UNION ALL
SELECT       -3142 FROM DUAL;

查询:

SELECT value, dec_to_2c_bin(value, 64) AS binary2c
FROM   table_name;

输出:

VALUE BINARY2C
1647795600 0000000000000000000000000000000001100010001101110101110110010000
-1647795600 1111111111111111111111111111111110011101110010001010001001110000
25143 0000000000000000000000000000000000000000000000000110001000110111
3142 0000000000000000000000000000000000000000000000000000110001000110
-3142 1111111111111111111111111111111111111111111111111111001110111010

db<>fiddle here