如何在 Excel 2007 中执行两个二进制数的异或计算

2024-01-29

我想对两个二进制数执行异或计算,例如:在工作表 1 上

Range A1 = 10101010
Range A2 = 11100010

现在我需要对A1、A2结果进行异或运算得到A3。我尝试了不同的公式的两个执行异或计算,例如:A1^A2, (BITXOR (A1, A2))但不幸的是我认为它不起作用,因为我使用的是excel 2007“XOR”不支持。

我期待的结果是1001000.


首先,您应该注意 Excel2013 之前的 Excel 没有内置按位运算符或函数(即使操作数是数字,Excel 的 OR() 函数也是逻辑的)。 Excel 2013 终于添加了这个明显缺失的功能。

使用VBA

最简单的方法是创建一个执行此操作的用户定义函数。如果您准备好十进制输出、辅助列或非常重复的连接公式,则公式可以工作,但 VBA 可以解决这些限制 - 如果您能够在工作簿中包含代码,我建议您使用它。

十进制输入、十进制输出

下面的示例仅公开了内置的按位运算符,以用作 Excel 公式中的函数。我假设是整数类型,尽管您可以更改它以接受小数等。

您可以使用 Excel 内置的 BIN2DEC() 函数将字符串二进制数(例如“1010”)转换为十进制(对于前面的示例为 10),尽管这只能处理 9 位 + 符号位,或者您可以使用数组公式来为您转换它(请参阅下面的“使用公式”部分)。

Public Function BITWISE_OR(operand1, operand2)
   BITWISE_OR = CLng(operand1) Or CLng(operand2)
End Function
Public Function BITWISE_AND(operand1, operand2)
   BITWISE_AND = CLng(operand1) And CLng(operand2)
End Function
Public Function BITWISE_XOR(operand1, operand2)
   BITWISE_XOR = CLng(operand1) Xor CLng(operand2)
End Function

将数字结果转换回二进制字符串对于公式来说非常烦人 - 如果您需要的范围超出 Excel 内置的 DEC2BIN() (微不足道的 -512 到 +511)函数所覆盖的范围,那么我建议使用 VBA (见下文) ),或者使用列或行一点一点地构建二进制字符串(请参阅下面的“使用公式”部分)。

二进制字符串输入,二进制字符串输出

下面的代码本质上是根据输入字符串中的相应位依次遍历一个字符串,设置每个位。它使用以下方法就地对字符串执行位更改Mid$陈述。位串可以是任意长度。

下面的代码看起来很复杂,但实际上它是相同的基本内容,每个 And、Or 和 XOr 重复 3 次。

'str1, str2: the two bit strings. They can be different lengths.
'significantDigitsAreLeft: optional parameter to dictate how different length strings should be padded. Default = True.
Public Function Bitstr_AND(str1 As String, str2 As String, Optional significantDigitsAreLeft As Boolean = True)
    Dim maxLen As Long, resStr As String, i As Long
    If Len(str1) > Len(str2) Then maxLen = Len(str1) Else maxLen = Len(str2) 'get max length of the two strings
    str1 = getPaddedString(str1, maxLen, significantDigitsAreLeft) 'pad left or right to the desired length
    str2 = getPaddedString(str2, maxLen, significantDigitsAreLeft) 'pad left or right to the desired length
    resStr = String$(maxLen, "0") 'prepare the result string into memory (Mid$ can operate without creating a new string, for performance)
    For i = 1 To maxLen
        If Mid$(str1, i, 1) = "1" And Mid$(str2, i, 1) = "1" Then
            Mid$(resStr, i, 1) = "1" 'in-place overwrite of the existing "0" with "1"
        End If
    Next i
    Bitstr_AND = resStr
End Function
'For explanatory comments, see Bitstr_AND
Public Function Bitstr_OR(str1 As String, str2 As String, Optional significantDigitsAreLeft As Boolean = True)
    Dim maxLen As Long
    Dim resStr As String
    Dim i As Long
    If Len(str1) > Len(str2) Then maxLen = Len(str1) Else maxLen = Len(str2)
    str1 = getPaddedString(str1, maxLen, significantDigitsAreLeft)
    str2 = getPaddedString(str2, maxLen, significantDigitsAreLeft)
    resStr = String$(maxLen, "0")
    For i = 1 To maxLen
        If Mid$(str1, i, 1) = "1" Or Mid$(str2, i, 1) = "1" Then
            Mid$(resStr, i, 1) = "1"
        End If
    Next i
    Bitstr_OR = resStr
End Function
'For explanatory comments, see Bitstr_AND
Public Function Bitstr_XOR(str1 As String, str2 As String, Optional significantDigitsAreLeft As Boolean = True)
    Dim maxLen As Long
    Dim resStr As String
    Dim i As Long
    If Len(str1) > Len(str2) Then maxLen = Len(str1) Else maxLen = Len(str2)
    str1 = getPaddedString(str1, maxLen, significantDigitsAreLeft)
    str2 = getPaddedString(str2, maxLen, significantDigitsAreLeft)
    resStr = String$(maxLen, "0")
    For i = 1 To maxLen
        If Mid$(str1, i, 1) = "1" Then
            If Not Mid$(str2, i, 1) = "1" Then
                Mid$(resStr, i, 1) = "1"
            End If
        ElseIf Mid$(str2, i, 1) = "1" Then 'Save an If check by assuming input string contains only "0" or "1"
            Mid$(resStr, i, 1) = "1"
        End If
    Next i
    Bitstr_XOR = resStr
End Function
'Helper to pad string
Private Function getPaddedString(str As String, length As Long, padLeft As Boolean) As String
    If Len(str) < length Then
        If padLeft Then
            getPaddedString = String$(length - Len(str), "0") & str
        Else
            getPaddedString = str & String$(length - Len(str), "0")
        End If
    Else
        getPaddedString = str
    End If
End Function

使用公式

您可以使用文本函数或 Sumproduct 执行 XOR 运算。如果您不想使用 VBA 但又不想使用,这可能更合适确保公式涵盖所有情况是很痛苦的,如负数或不同长度的二进制字符串。我向您推荐这篇精彩的博客文章http://www.excelhero.com/blog/2010/01/5-and-3-is-1.html http://www.excelhero.com/blog/2010/01/5-and-3-is-1.html例如使用 Sumproduct,以及http://chandoo.org/wp/2011/07/29/bitwise-operations-in-excel/ http://chandoo.org/wp/2011/07/29/bitwise-operations-in-excel/例如使用文本函数。

我编写了自己的公式来处理某些情况,我在下面解释它们以指导您。

二进制字符串输入,十进制输出

下文中,A2和B2指最多32位字符串形式的两个二进制数。字符串的长度可以是可变的,因为公式将用 0 填充到必要的长度。如何将其增加到更多位应该是显而易见的。他们必须使用 Ctrl+Shift+Enter 输入.

最重要的位位于左侧。为了使它的最低有效位位于左侧,您可以删除 2 部分的幂中的小减法,并将其填充到右侧。

按位与:

=SUM((((MID(REPT("0",32-LEN($A$2))&$A$2,ROW($1:$32),1)="1")+(MID(REPT("0",32-LEN($B$2))&$B$2,ROW($1:$32),1)="1"))=2)*(2^(32-ROW($1:$32))))

按位或:

=SUM((((MID(REPT("0",32-LEN($A$2))&$A$2,ROW($1:$32),1)="1")+(MID(REPT("0",32-LEN($B$2))&$B$2,ROW($1:$32),1)="1"))>0)*(2^(32-ROW($1:$32))))

按位异或:

=SUM((((MID(REPT("0",32-LEN($A$2))&$A$2,ROW($1:$32),1)="1")+(MID(REPT("0",32-LEN($B$2))&$B$2,ROW($1:$32),1)="1"))=1)*(2^(32-ROW($1:$32))))

二进制字符串输入,二进制字符串输出

单单元格解决方案会很困难,因为 Excel 中没有数组串联公式。您可以使用 CONCATENATE 函数将每个位粘合在一起,每个位都是 If 比较每个二进制字符串的结果,根据需要返回 1 或 0。正如我所说,虽然很简单(只需将其构建为 =IF(Mid(A1,1,1) = "1",...),但这会很无聊,所以我个人不会为你这样做;)

或者,您可以更简单地使用列或行来构建字符串,例如: 如果 A1 和 B1 有二进制字符串,则在 C1 中输入(对于 AND,或对于 OR,将末尾的 =2 更改为 >0,对于 XOR,将其更改为 =1):

=IF((MID($A1,1,1)="1")+(MID($B1,1,1)="1"))=2,“1”,“0”)

然后在D1中输入:

=C1 & IF((MID($A1,COLUMN()-COLUMN($C1),1)="1")+(MID($B1,COLUMN()-COLUMN($C1),1)="1"))=2,"1","0")

然后将其拖过尽可能多的列

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Excel 2007 中执行两个二进制数的异或计算 的相关文章

  • VBA 中的多线程

    这里有人知道如何让VBA运行多线程吗 我正在使用 Excel 无法用 VBA 本地完成 VBA 构建在单线程单元中 获得多个线程的唯一方法是使用 VBA 之外的其他具有 COM 接口的东西构建 DLL 并从 VBA 调用它 信息 OLE 线
  • 如何找到特定程序的安装目录?

    我已经成功地编写了一些用于工作的 VBA 宏 这些宏基本上创建了一个数据文件 将其提供给一个程序并对该程序的输出进行后处理 我的问题是程序安装路径是硬编码在宏中的 并且安装在我同事的计算机上可能会有所不同 我首先想到的是 我可以从每个人那里
  • 使用 ObjPtr(Me) 返回自定义类实例的名称?

    我明白那个ObjPtr http support microsoft com kb 199824将返回内存中对象的地址 并且它指向一个名为 IUNKNOWN 的结构 并且其中编码了某种接口定义以公开对象结构 但我不知道如何确定一个对象的接口
  • 将包含宏的工作簿复制到不带宏的工作簿

    我能够复制工作簿 复制到所需位置 其中在后台包含宏 该副本还包含相同的宏 我的问题是我不希望这个重复的工作簿包含宏 谁能告诉怎么做吗 先感谢您 将您的工作簿保存为无宏 即简单地保存为 Excel 工作簿 对于我的 Excel 2007 这是
  • JasperReports 中每个工作表属性一页

    我有一个要求 我必须在 JasperReports 中设计一个报告 该报告有 4 页 第一张纸有 5 页 类似的其他纸有一页或两页 我面临的问题是 如果我使用net sf jasperreports export xls one page
  • 我可以获取VBA代码中的注释文本吗

    可以说我有以下内容 Public Sub Information TEST End Sub 有没有办法得到 TEST 结果 不知何故通过VBA 例如 在 PHP 中 有一个获取注释的好方法 这里有什么想法吗 编辑 应该有办法 因为像 MZ
  • 在VBA中初始化全局变量

    在 Excel 2003 中 如何声明全局变量并仅在打开工作簿时初始化它们一次 我有一些由几个宏使用的参数 基本上是输入文件的路径 目前 我的代码如下所示 global path1 path2 as string sub initPaths
  • SQL Excel VBA 运行时错误 3709 无效连接

    这是我的第一个问题 欢迎提出建设性的批评 我正在尝试从 Excel VBA 查询 Access 数据库并将返回信息放入 Excel 范围中 我收到此错误 错误消息 运行时错误 3709 连接无法用于 执行此操作 在此情况下它已关闭或无效 语
  • 在 Excel 中自动复制和粘贴特定范围的最佳方法是什么?

    我对 VBA 非常陌生 我想自动化一项任务 但不知道从哪里开始 我有一个如下所示的数据集 样本数据 https i stack imgur com jxqFI png 我想做的是循环遍历 A 列 如果其中有内容 始终是电子邮件 请选择所有行
  • 将 Excel 读取到从第 5 行开始并包括标题的 Python 数据框

    我有一个 Excel 工作簿 它在打开时运行一些 vba 刷新数据透视表并执行其他一些操作 然后我希望将数据透视表刷新的结果导入到 python 中的数据框中以进行进一步分析 import xlrd wb xlrd open workboo
  • 比较 EXCEL 中的列本身以检查其是否有重复值

    假设我有一个名为项目代码的列 如下所示 row code 1 A123 2 B123 n A123 代码列中的值可能出现多次 如何使用Excel公式或Excel中的任何方法检查列中的重复记录 Thanks 根据您使用的 Excel 版本 您
  • Excel - 公式或宏根据链接到另一个单元格的另一个单元格填充单元格

    在 Excel 中 我试图根据其他两个单元格中包含的值创建一个单元格 我需要单元格 X 和 Y 来获取基于单元格 L 和 的数据 就像这样 X Y L 1 2 3 4 5 6 A 6 1 1 6 1 6 1 7 1 7 2 7 2 8 1
  • 从Excel工作表中读取汉字? (总是返回“???”)

    如何从Excel单元格中读取汉字并将其写入文件 当我取值时 Worksheets ActiveCell Worksheet Name Cells 3 columnNumbers 0 value 它总是返回 Dim fileStream Fi
  • 计算序列中的重复值

    如何使用Excel计算列中的重复数据 Example A B apple 1 apple 2 apple 3 ball 1 bat 1 dog 1 dog 2 gole 1 gole 2 gole 3 gole 4 我认为对于你的情况中的所
  • 生成Excel文件错误

    我在经典 ASP 中使用以下代码生成 Excel 文件 代码很简单并且有效 我在 Windows Vista x86 上的 IIS 7 0 下运行代码 两个问题 有一个奇怪的警告框 这是屏幕快照 http i27 tinypic com 2
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 如何获取活跃的Excel实例?

    我有一个 C 应用程序 该应用程序根据用户需求将信息粘贴到 excel 背后的逻辑是这样的 如果没有正在运行的 excel 实例 它会创建一个实例并粘贴到该实例 如果只有一个实例在运行 它会尝试获取该实例并使用它 这是我用来执行此操作的代码
  • 从 X、Y、Z 数据、Excel 或其他工具进行 3D 绘图

    我的数据看起来像这样 1000 13 75 2 1000 21 79 21 1000 29 80 02 5000 29 87 9 5000 37 88 54 5000 45 88 56 10000 29 90 11 10000 37 90
  • python XlsxWriter 设置多个单元格周围的边框

    I need an easy way to set border around multiple cells like so 我发现的只是 1 个单元格的边框 并合并单元格 这不是我需要的 我期待类似的事情 worksheet range
  • 行编号选择自动填充直到最后[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含数千行的表 我想通过在第一行旁边添加 1 2 3 来对行进行编号 然后选择这些行并拖动到最后以使用递增的数字进行填充 如何自动

随机推荐

  • 整数之和 - 'int' 对象不可迭代

    我的问题与 python 中的 sum 函数有关 所以我的代码是 def black jack a b if sum a b gt 21 return 0 else return sum a b print black jack 10 5
  • 以编程方式更改按钮的drawableLeft

    我正在使用按钮
  • 在 JavaScript 中从一种基数转换为另一种基数[重复]

    这个问题在这里已经有答案了 在 JavaScript 中 是否有任何内置函数可以将整数从一个给定基数转换为另一个给定基数 我注意到已经可以使用以下命令将十进制数转换为另一个基数toString numberToConvertTo 但我还没有
  • Javascript 滚动到末尾

    有时 软件安装程序会强制您在启用 我同意 框之前滚动到 EULA 的末尾 如何在网页上产生同样的效果
  • 从 Spark 集群收集数据时出现内存不足错误

    我知道有很多关于 Spark 内存不足错误的问题 但我还没有找到解决方案 我有一个简单的工作流程 从 Amazon S3 读取 ORC 文件 filter直至一小部分行 select一小部分列 collect进入驱动程序节点 这样我就可以在
  • 我们如何在 Spring Boot 中使用任一验证?

    我的 bean 中有两个变量 我想要填写名称或手机 它们不能同时为空 NotNull private String name NotNull private String mobile 我怎样才能做到这一点 您需要为此编写自定义注释并在类上
  • Apache X-Frame-Options 允许来自多个域

    当我在 apache 中使用 x frame headers 选项时出现错误 Header always append X Frame Options ALLOW FROM site1 site2 site3 or Header alway
  • 指向作为 JNA 方法参数的结构数组的指针

    我正在尝试创建一个 JNA 实现SctpDrv http www bluestop org SctpDrv 图书馆 我的问题是我不了解指向结构数组的指针 我试图寻找解决方案 但它们总是与我需要知道的略有不同 JNA 文档仅显示了一个带有指向
  • Java 中 CRTP 的替代品 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 The CRTP https en wikipedia org wiki Curiously recurring template patter
  • 在 React Native 中存储来自 json api 的大数据集合的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要制作一个具有离线功能的应用程序 可以从 json api 获取大约 10 000 个对象 估计 10mb 数据 并将它们存储在本地 以便在
  • Eloquent:带时间戳的默认值无效

    这是我的迁移架构 public function up Schema create objects function Blueprint table table gt increments id table gt timestamp tim
  • UICollectionView补充视图如何正确插入或删除

    简短的问题 有没有办法添加和删除补充视图 例如单元格和部分performBatchUpdates 块类似于insertItemsAtIndexPaths deleteItemsAtIndexPaths 甚至reloadItemsAtInde
  • 为什么 Oracle 不告诉你哪个表或视图不存在?

    如果您使用过 Oracle 您可能会收到有用的消息 ORA 00942 表或视图不存在 该消息不包含丢失对象的名称是否存在合法的技术原因 关于这是出于安全原因的争论听起来像是美国运输安全管理局 TSA 精心策划的 如果我是攻击者 我就会知道
  • 如何使用 d.items() 更改 for 循环中的所有字典键?

    我需要一些帮助来理解为什么这段代码没有按预期工作 如果想更改字典的键但保留值 他 她可以使用 d new key d pop old key 我想修改所有键 并将值保留在适当的位置 但下面的代码会跳过某些行 col2 保持不变 是因为字典是
  • 为什么管道的容量有限?

    我读到管道需要有有限的容量 但我不明白为什么 如果进程无限制地写入管道会发生什么 这是由于缓冲 管道并不 神奇 管道并不能确保所有进程都按步调一致地处理每个单独的字节或字符 相反 管道缓冲进程间输出 然后传递缓冲区 这个缓冲区大小限制就是您
  • 带滑动菜单的 Sherlock 操作栏

    我正在创建一个扩展 SherlockMapActivity 的视图和活动 并使用 SlidingMenu 库使我的主视图像 Google 一样滚动 我已经通过 XML 添加了 SlidingMenu 并且我的视图滚动完美地显示了隐藏菜单 但
  • 如何停止matlabplot3缩放

    我想使用绘制摆 改变位置 plot3功能 不幸的是 当我的点在循环中改变位置并再次绘制时 3d 图的比例也在变化 因此 x 轴取决于位置变化 取决于点的位置 它可以从 1 到 1 5 或从 1 到 3 并且 y 也会改变 只有 z 表示相同
  • 如何检测 Ag-grid 中的细胞模糊(失焦)事件

    我需要检测网格单元何时在农业网格中失去焦点 我已经检查了文档中可用的 API 但没有找到任何类似于单元格模糊的内容 https www ag grid com javascript grid events https www ag grid
  • SBT 在所有子项目之后运行任务

    我想编写一个在所有子项目任务完成后运行的任务 例如 如果我这样做 sbt a b然后在所有子项目上完成任务 a 后 我想执行任务 b 我不想对每个项目都做 a b 那可能吗 事实上 我会直接修改build sbt 我不一定必须在命令行中指定
  • 如何在 Excel 2007 中执行两个二进制数的异或计算

    我想对两个二进制数执行异或计算 例如 在工作表 1 上 Range A1 10101010 Range A2 11100010 现在我需要对A1 A2结果进行异或运算得到A3 我尝试了不同的公式的两个执行异或计算 例如 A1 A2 BITX