问题描述
在 Google 表格中,我试图将 16 位 有符号 二进制数转换为其等效的十进制数,但是执行此操作的内置函数最多只需要 10 位。我见过的问题的其他解决方案不保留签名。
到目前为止我已经尝试过:
- 最左边 8 位的 bin2dec * 2^8 + 最右边 8 位的 bin2dec
- 将最左边 8 位 bin2dec 的结果与最右边 8 位 bin2dec 连接起来的 hex2dec
我还看到一个建议,将每一位乘以其 2 的幂,完全消除 bin2dec。
有什么建议吗?
解决方法
您将需要使用自定义函数
function binary2decimal(bin) {
return parseInt(bin,2);
}
,
假设您的二进制数位于单元格 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;