由于这些是交换和关联运算符,我认为没有理由将它们限制为两个参数。
我可以使用我为非负Long
值编写的以下VBA函数,最多2 31 ,但是对于任何更大的值都会溢出。
Function RangeBitOr(rng As Range) As Long
Dim i As Long
Dim cell As Range
i = 0
For Each cell In rng
i = i Or CLng(cell.Value)
Next cell
RangeBitOr = i
End Function
Excel的内置函数BITAND
和BITOR
(在Excel 2013中引入)可以处理值一直到2 48 - 1并且我想要这个功能适用于范围。
是否有一种简单的方法可以使这些位运算符在达到此限制的范围内工作?
我尝试了几种解决方法:
创建两个新列并使用MOD
将较大的值拆分为两个较小的值,然后在每个列上使用RangeBitOr
函数,然后将值重新组合在一起。
为BITOR
函数创建一个列,将正在运行的聚合与当前值合并,并将最后一个作为该范围的总BITOR
。
理想情况下,我想要一个不需要辅助列或VBA的解决方案,但我愿意接受任何有用的建议。
答案 0 :(得分:2)
正如@Comintern在评论中指出的那样,我的VBA函数可以扩展到至少{2}的限制为2 48 - 1(可能高达9,007,199,254,740,992 = 2 BITOR替换为Long
,如下所示:
LongLong
如果有人有非VBA解决方案,我仍然感兴趣。
答案 1 :(得分:1)
除非MS决定将功能扩展为包括范围,否则我认为不会有任何纯公式解决方案
但是如果您愿意,您仍然可以手动使用替代方法公式,例如
=BITOR(A1, BITOR(B1, BITOR(C1, BITOR(D1))))
BITAND
可以使用相同的方法
如果您可以花一些空间来减少手动键入的工作量,则可以
=BITOR(value1, value2)
n - 2
拖动一次,并垂直{em> 多次拖动n
值列表对于4个值进行“或”运算,结果是这样的,最终结果在单元格D1中
╔═══╦════╤════════════════╤════════════════╤════════════════╗
║ ║ A │ B │ C │ D ║
╠═══╬════╪════════════════╪════════════════╪════════════════╣
║ 1 ║ 2 │ =BITOR(A1, A2) │ =BITOR(B1, B2) │ =BITOR(C1, C2) ║
╟───╫────┼────────────────┼────────────────┼────────────────╢
║ 2 ║ 4 │ =BITOR(A2, A3) │ =BITOR(B2, B3) │ ║
╟───╫────┼────────────────┼────────────────┼────────────────╢
║ 3 ║ 8 │ =BITOR(A3, A4) │ │ ║
╟───╫────┼────────────────┼────────────────┼────────────────╢
║ 4 ║ 16 │ │ │ ║
╚═══╩════╧════════════════╧════════════════╧════════════════╝
您还可以将数组公式用于大量值,以减少拖动工作量,文件大小并提高速度
=BITOR(A1:A3, A2:A4)
,然后按 Ctrl + Shift + Enter