bin2dec 用于 16 位有符号二进制值在谷歌表中

问题描述

在 Google 表格中,我试图将 16 位 有符号 二进制数转换为其等效的十进制数,但是执行此操作的内置函数最多只需要 10 位。我见过的问题的其他解决方案不保留签名。

到目前为止我已经尝试过:

  • 最左边 8 位的 bin2dec * 2^8 + 最右边 8 位的 bin2dec
  • 将最左边 8 位 bin2dec 的结果与最右边 8 位 bin2dec 连接起来的 hex2dec

我还看到一个建议,将每一位乘以其 2 的幂,完全消除 bin2dec。

有什么建议吗?

解决方法

您将需要使用自定义函数

function binary2decimal(bin) {
return parseInt(bin,2);  
}

enter image description here

,

假设您的二进制数位于单元格 A2 中。

首先设置格式如下:格式>数字>纯文本

然后将以下公式放入 B2 中:

=ArrayFormula(SUM(SPLIT(REGEXREPLACE(SUBSTITUTE(A2&"","-",""),"(\d)","$1|"),"|")*(2^SEQUENCE(1,LEN(SUBSTITUTE(A2&"","")),""))-1,-1))*IF(LEFT(A2)="-",-1,1)))

此公式将处理任何长度的二进制数,无论正负,从 1 位到 16 位(实际上,长度为 45 或 46 位)。

这个公式的作用是将二进制数(如果存在则不带负号)SPLIT 分成单独的位,每列一个;将其中的每一个乘以 2 乘以相等大小的递减 SEQUENCE 的每个元素的幂,该递减 LEN 从位的 IF(即数量)的高位向下到零;最后有条件地应用负号 =ArrayFormula(MMULT(SPLIT(REGEXREPLACE(SUBSTITUTE(FILTER(A2:A,A2:A<>"")&"",16,15,-1)),SEQUENCE(16,1,0))*IF(LEFT(FILTER(A2:A,A2:A<>""))="-",1)) one存在。

如果您需要处理一个范围,其中每个值都是一个正好是 16 位的正或负二进制数,您可以这样做.假设您的 16 位二进制数在 A2:A 范围内。首先,确保选择所有 A 列并将格式设置为“纯文本”,如上所述。然后将以下数组公式放入 B2(首先确保 B2:B 为空):

vFileName varchar2(100); vDirectory varchar2(100) := 'IO_DIR_TEST_FILE_EXTRACTS'; vTestFile utl_file.file_type; vRow varchar2(6000); vSql clob; vFirstItem number; vLastItem number; vCurRow sys_refcursor; vRecCnt number := 0; cursor vFileItemCur is select dm.FileItemName,dm.DbDataType,dm.FileItemOrder,dm.FileItemLength from test_data.test_data_model dm where dm.FileName = 'Notes File' and dm.ActiveFlag = 'Y' order by dm.FileItemOrder asc;