将Excel按位功能(BITAND或BITOR)应用于具有较大值的范围

时间:2016-08-04 23:55:42

标签: excel vba excel-formula bit-manipulation worksheet-function

由于这些是交换和关联运算符,我认为没有理由将它们限制为两个参数。

我可以使用我为非负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的内置函数BITANDBITOR(在Excel 2013中引入)可以处理值一直到2 48 - 1并且我想要这个功能适用于范围。

是否有一种简单的方法可以使这些位运算符在达到此限制的范围内工作?

我尝试了几种解决方法:

  1. 创建两个新列并使用MOD将较大的值拆分为两个较小的值,然后在每个列上使用RangeBitOr函数,然后将值重新组合在一起。

  2. BITOR函数创建一个列,将正在运行的聚合与当前值合并,并将最后一个作为该范围的总BITOR

  3. 理想情况下,我想要一个不需要辅助列或VBA的解决方案,但我愿意接受任何有用的建议。

2 个答案:

答案 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)
  • 水平{em> 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 │                │                │                ║
╚═══╩════╧════════════════╧════════════════╧════════════════╝

您还可以将数组公式用于大量值,以减少拖动工作量,文件大小并提高速度

  • 在第一列上,选择3个单元格,键入=BITOR(A1:A3, A2:A4),然后按 Ctrl + Shift + Enter
  • 单击拖动手柄,然后将列水平拖动两次。结果将类似地放在上面的单元格D1中