将Excel按位function(BITAND或BITOR)应用于具有较大值的范围
既然这些是交换性和联想性的操作符,我没有理由将它们限制在两个参数之中。
我可以使用我写的非负Long
值高达2 31的以下VBA函数,但是对于任何更大的值,它都会溢出。
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,我希望这个能力适用于一个范围。
是否有一个简单的方法让这些位操作员在这个范围内工作?
我尝试了几个解决方法:
-
创build两个新列,并使用
MOD
将较大的值拆分为两个较小的值,然后对每个列使用RangeBitOr
函数,然后将这些值重新组合。 -
为
BITOR
函数创build一个列,将正在运行的聚合与当前值合并,并将最后一个作为范围的总BITOR
。
理想情况下,我想有一个不需要帮助列或VBA的解决scheme,但我愿意接受任何有用的build议。
正如@Comintern在评论中指出的那样,通过简单地用LongLong
replaceLong
,我的VBA函数可以扩展到至lessBITOR
限制为2 48 – 1(可能高达9,007,199,254,740,992 = 2 53或更高),如下所示:
Function RangeBitOr(rng As Range) As LongLong Dim i As LongLong Dim cell As Range i = 0 For Each cell In rng i = i Or CLngLng(cell.Value) Next cell RangeBitOr = i End Function
如果有人有非VBA解决scheme,我仍然感兴趣。