在 Excel 中处理 10 位以外的有符号数
Working with signed numbers other than 10-bit in Excel
我在 Excel 中是否缺少某种方法来设置二进制数的真实位数,或者我们是否坚持使用 10 位 DEC2BIN 和 BIN2DEC? 10 位是一个奇怪的选择。
理想情况下,我希望能够在真正带符号的 8 位世界或真正带符号的 16 位世界之间进行选择,并能够对这些数字执行操作。就目前而言,我无法将 11111111 设置为 -1 而不是 255。还有其他人处理过这个问题吗?
提前致谢。
带符号位+七个数据位在A1
=IF(LEFT(A1,1)="1",BIN2DEC(MID(A1,2,9999))-128,BIN2DEC(MID(A1,2,9999)))
例如:
Excel 对二进制、八进制和十六进制数施加 10 个字符的限制。对于二进制,这与 10 位限制一致。这个限制没有什么意义,我认为这是一个任意的决定,每个 Excel 版本都保留以保持向后兼容性。
对于 8 位二进制补码:
=LEFT(A1)*-128 + BIN2DEC(MID(A1,2,7))
对于 16 位二进制,将二进制数的每一半转换为十六进制并连接。您可以将该结果提供给 HEX2DEC
。然后,您可以像处理 8 位一样处理二进制补码:
=LEFT(A1)*-32768 + HEX2DEC(BIN2HEX(MID(A1,2,7),2) & BIN2HEX(MID(A1,9,8),2))
DEC2BIN 和 BIN2DEC 使用 10 位有符号数,即 -512 到 511。
但是,由DEC2BINreturn编码的二进制表示是一个字符串。
DEC2BIN(7) returns "111", not 111.
如果您尝试对生成的二进制数进行数学运算,它会像在数字上下文中使用的任何字符串一样被处理:它使用 base-10 从字符串转换为数字。
DEC2BIN(7+1) returns "1000", 但 DEC2BIN(7)+1 returns 112. (即."111" + 1)
BIN2DEC(99+12) returns 7.(内部分为三步:99+12 -> 111 -> "111" -> 7.)
根据您的需要,我建议避免使用 DEC2BIN 和 BIN2DEC,并使用您自己的 VBA 函数进行转换,例如:http://www.vb-helper.com/howto_decimal_to_binary.html
您可以使用附加参数来增强这些函数,以指定 signed/unsigned 和 8/16/32 位,以及 return NaN 或二进制溢出错误。
VBA "Long" 数据类型是 64 位有符号整数(大约 18 位十进制数字),但您将无法利用 to/from Excel,处理 15 位数字而不损失精度。
VBA "Long" 使用 32 位无符号不会有问题。
>>>编辑更正:VBA长是32-位 有符号整数。
VBA Double 有一个 52 位尾数,所以至少可以用于 48 位有符号整数不损失精度的算法。
只重复第一位:
32 位到 40 位
HEX2DEC(
IF(LEFT(HEX2BIN([@DH6]),1)="1","FF","")
&[@DH6]
&[@DH5]
&[@DH4]
&[@DH3]
)
这个公式不成立。
尝试使用 10000000 的公式。
'Real' 的答案是 384,但公式的答案是 768,即 100000000。
我不知道那个特定的公式有什么问题?
我找到了一个有效的公式:
=SUMPRODUCT(--MID(Z24,LEN(Z24)+1-ROW(INDIRECT("1:"&LEN(Z24))),1),(2^(ROW(INDIRECT("1:"&LEN(Z24)))-1)))
我在 Excel 中是否缺少某种方法来设置二进制数的真实位数,或者我们是否坚持使用 10 位 DEC2BIN 和 BIN2DEC? 10 位是一个奇怪的选择。
理想情况下,我希望能够在真正带符号的 8 位世界或真正带符号的 16 位世界之间进行选择,并能够对这些数字执行操作。就目前而言,我无法将 11111111 设置为 -1 而不是 255。还有其他人处理过这个问题吗?
提前致谢。
带符号位+七个数据位在A1
=IF(LEFT(A1,1)="1",BIN2DEC(MID(A1,2,9999))-128,BIN2DEC(MID(A1,2,9999)))
例如:
Excel 对二进制、八进制和十六进制数施加 10 个字符的限制。对于二进制,这与 10 位限制一致。这个限制没有什么意义,我认为这是一个任意的决定,每个 Excel 版本都保留以保持向后兼容性。
对于 8 位二进制补码:
=LEFT(A1)*-128 + BIN2DEC(MID(A1,2,7))
对于 16 位二进制,将二进制数的每一半转换为十六进制并连接。您可以将该结果提供给 HEX2DEC
。然后,您可以像处理 8 位一样处理二进制补码:
=LEFT(A1)*-32768 + HEX2DEC(BIN2HEX(MID(A1,2,7),2) & BIN2HEX(MID(A1,9,8),2))
DEC2BIN 和 BIN2DEC 使用 10 位有符号数,即 -512 到 511。
但是,由DEC2BINreturn编码的二进制表示是一个字符串。
DEC2BIN(7) returns "111", not 111.
如果您尝试对生成的二进制数进行数学运算,它会像在数字上下文中使用的任何字符串一样被处理:它使用 base-10 从字符串转换为数字。
DEC2BIN(7+1) returns "1000", 但 DEC2BIN(7)+1 returns 112. (即."111" + 1)
BIN2DEC(99+12) returns 7.(内部分为三步:99+12 -> 111 -> "111" -> 7.)
根据您的需要,我建议避免使用 DEC2BIN 和 BIN2DEC,并使用您自己的 VBA 函数进行转换,例如:http://www.vb-helper.com/howto_decimal_to_binary.html
您可以使用附加参数来增强这些函数,以指定 signed/unsigned 和 8/16/32 位,以及 return NaN 或二进制溢出错误。
VBA "Long" 数据类型是 64 位有符号整数(大约 18 位十进制数字),但您将无法利用 to/from Excel,处理 15 位数字而不损失精度。
VBA "Long" 使用 32 位无符号不会有问题。
>>>编辑更正:VBA长是32-位 有符号整数。
VBA Double 有一个 52 位尾数,所以至少可以用于 48 位有符号整数不损失精度的算法。
只重复第一位:
32 位到 40 位
HEX2DEC(
IF(LEFT(HEX2BIN([@DH6]),1)="1","FF","")
&[@DH6]
&[@DH5]
&[@DH4]
&[@DH3]
)
这个公式不成立。
尝试使用 10000000 的公式。 'Real' 的答案是 384,但公式的答案是 768,即 100000000。 我不知道那个特定的公式有什么问题?
我找到了一个有效的公式:
=SUMPRODUCT(--MID(Z24,LEN(Z24)+1-ROW(INDIRECT("1:"&LEN(Z24))),1),(2^(ROW(INDIRECT("1:"&LEN(Z24)))-1)))