位运算的实际应用[关闭]

2023-12-09

  1. 你用位运算来做什么?
  2. 为什么它们这么方便?
  3. 有人可以推荐一个非常简单的教程吗?

尽管每个人似乎都对标志用例着迷,但这并不是按位运算符的唯一应用(尽管可能是最常见的)。此外,C# 是一种足够高级的语言,其他技术可能很少使用,但仍然值得了解它们。这是我能想到的:


The << and >>运算符可以快速乘以 2 的幂。当然,.NET JIT 优化器可能会为您执行此操作(以及其他语言的任何不错的编译器),但如果您真的为每一微秒而烦恼,您可能会写下这个是为了确定。

这些运算符的另一个常见用途是将两个 16 位整数填充到一个 32 位整数中。喜欢:

int Result = (shortIntA << 16 ) | shortIntB;

这对于与 Win32 函数直接连接很常见,有时出于遗留原因使用此技巧。

当然,当您想要迷惑没有经验的人时,例如在提供家庭作业问题的答案时,这些运算符非常有用。 :)

但在任何实际代码中,使用乘法会更好,因为它具有更好的可读性,并且 JIT 将其优化为shl and shr无论如何都有指令,所以不会有性能损失。


相当多奇怪的技巧处理^运算符(异或)。这实际上是一个非常强大的运算符,因为具有以下属性:

  • A^B == B^A
  • A^B^A == B
  • 如果你知道的话A^B那么就无法说出什么A and B是,但如果你知道其中之一,你就可以计算出另一个。
  • 该运算符不会遇到任何溢出,例如乘法/除法/加法/减法。

我见过使用这个运算符的一些技巧:

在没有中间变量的情况下交换两个整数变量:

A = A^B // A is now XOR of A and B
B = A^B // B is now the original A
A = A^B // A is now the original B

双向链表,每一项只有一个额外变量。这在 C# 中用处不大,但对于每个字节都很重要的嵌入式系统的低级编程可能会派上用场。

这个想法是你跟踪第一个项目的指针;最后一项的指针;对于您跟踪的每一项pointer_to_previous ^ pointer_to_next。这样,您可以从任意一端遍历列表,但开销仅为传统链表的一半。下面是遍历的C++代码:

ItemStruct *CurrentItem = FirstItem, *PreviousItem=NULL;
while (  CurrentItem != NULL )
{
    // Work with CurrentItem->Data

    ItemStruct *NextItem = CurrentItem->XorPointers ^ PreviousItem;
    PreviousItem = CurrentItem;
    CurrentItem = NextItem;
}

要从末尾遍历,您只需将第一行更改为FirstItem to LastItem。这是另一个节省内存的地方。

我使用的另一个地方^在 C# 中定期使用运算符是当我必须为我的复合类型类型计算 HashCode 时。喜欢:

class Person
{
    string FirstName;
    string LastName;
    int Age;

    public int override GetHashCode()
    {
        return (FirstName == null ? 0 : FirstName.GetHashCode()) ^
            (LastName == null ? 0 : LastName.GetHashCode()) ^
            Age.GetHashCode();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

位运算的实际应用[关闭] 的相关文章

随机推荐

  • jqGrid表单编辑,HTML代替表单字段中的值

    我在用表单编辑 and 内联编辑在我的网格中 jqGrid 4 5 2 当我有一个可编辑列然后打开表单时 我确实看到了 HTML 代码而不是值 屏幕截图显示了我的意思 如果相应行中没有可编辑的字段 则一切正常 我在某处读过 我不会使用For
  • 如何使用钩子更新 SolidJS 中的本地存储值

    我正在尝试为solid js 制作一个自定义 钩子 它将从本地存储中检索状态 import Accessor createSignal Setter from solid js export default function createL
  • 通过直接字段访问复制对象属性

    有没有一种简单的方法可以将对象的属性复制到具有相同字段名称的不同类的另一个对象上使用直接字段访问 即 当其中一个类没有字段的 getter 或 setter 时 我可以用org springframework beans BeanUtils
  • 我可以让 plpgsql 函数在不使用变量的情况下返回整数吗?

    像这样的东西 CREATE OR REPLACE FUNCTION get param id integer RETURNS integer AS BODY BEGIN SELECT col1 FROM TABLE WHERE id par
  • 在 iPhone 中将两个 .caf 音频文件合并为一个音频文件

    我正在使用 AVAudioRecorder 以 caf 格式录制音频 当用户恢复该记录时 新记录必须附加到旧记录之后 那么我如何组合两个 caf 音频文件 您可以使用 ExtAudioFileService 来完成此操作 在 ios 开发人
  • 如何使用 XSD 排除 XML 文件中的枚举值?

    是否可以指定标签或属性的值不应该像某个值 我有一个奇怪的要求 xsd 不知道发送给它的值 该特定标签的值可以是具有任何值的字符串除了一个值 say data migration 如果发送了该特定值 则应向发送者确认错误 是否可以指定此限制
  • Three.js renderer.autoClear 属性不起作用?

    我试图让渲染器写入前一帧的顶部 如果我正确理解 autoClear 的上下文 则 renderer autoClear false 应该使这成为可能 但我似乎无法使其发挥作用 这是一个代码笔示例 http codepen io anon p
  • 如何使 HTML5 数字字段显示尾随零?

    我有一个字段
  • Laravel 发送电子邮件、配置和发送脚本

    我的 Laravel 电子邮件客户端有问题 我需要通过单击按钮发送电子邮件 我的代码 env MAIL DRIVER smtp MAIL HOST mail somedomain com MAIL PORT 587 MAIL USERNAM
  • 如何将数组分为 3 个元素组,按最后一个元素对它们进行排序并显示元素?

    我试图以 3 个元素为一组显示数组 并按每组的最后一个元素排序 我的阵列 info array goal raul 80 foul moneer 20 offside ronaldo 60 我的预期输出是 1 foul moneer 20
  • 来自 Google App Engine 的 dev_appserver.py 出现“ImportError:没有名为 _ssl 的模块”

    背景 在 Python 运行时中 我们添加了对 Python SSL 的支持 库 因此您现在可以打开与远程服务的安全连接 例如苹果的推送通知服务 这个报价是摘自 Google App Engine 博客上最近的一篇文章 执行 如果要使用本机
  • Android Google Maps API v2 的内存泄漏

    我正在努力解决 Google Maps Android API v2 的内存泄漏问题 每次我的视图再次可见后 堆使用量都会增加约 85KB 电话屏幕关闭 例如按电源按钮后 用户按主页按钮退出应用程序 该应用程序最终崩溃并显示内存不足异常 屏
  • 契约优先的 SOA:设计业务领域:WCF

    我正在使用 WCF 构建一个全新的系统 我将使用契约优先方法来构建基于面向服务的概念的服务 我有一项服务操作 可返回用户的银行帐户详细信息 账户类型可以是 FixedAccount 或 SavingsAccount 我将服务设计如下 Ser
  • 如何在 Flask 应用程序中创建动态子域

    我正在尝试在 Flask 应用程序中设置变量路由处理 如本答案中所述 Web 应用程序中的动态子域处理 Flask 然而 我希望能够在某些子域被变量路由捕获之前识别它们 这样我就可以使用flask restful api扩展 使用 REST
  • PHP PDO 事务回滚不起作用

    一切还好吧请有人帮助我吗我正在尝试使用 PHP PDO 事务 但我遇到了一个问题 但我无法处理它 rollBack 函数在捕获异常时不起作用这是连接代码 host localhost user root pass error dbname
  • r闪亮:从另一个rhandsontable更新rhandsontable

    我希望你很好 我正在尝试创建一个闪亮的仪表板 用户可以通过该仪表板从一个rhandsontable 更新另一个rhandsontable 我的代码如下 library shiny library rhandsontable channel
  • 使用 config.filter_parameters 对 Rails 3 中的参数进行自定义过滤

    我正在努力从 Rails 2 3 11 升级到 3 0 10 并且在转换中的内容时遇到问题ApplicationController s filter parameter logging 我想过滤某些参数 如果它们出现在类似 a 的值中 也
  • 我的 iPad 运行时内存去哪儿了?

    我导致设备 iPad 明显耗尽内存 所以它放弃了我的应用程序 我试图了解发生了什么 因为 Instruments 告诉我我正在使用大约 80Mb 并且设备上没有运行其他应用程序 我找到了这个代码片段来向 iOS 下的 Mach 系统询问内存
  • 保存Word文档

    我想根据Word安装的版本保存Word文档 如果是Word 2003 适当的版本号是11 则DOC扩大 如果Word版本高于2003 则DOCX扩大 差异反映在发送到的第二个参数中SaveAS方法 object fileFormat Gra
  • 位运算的实际应用[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 你用位运算来做什么 为什么