C hack 用于存储占用 1 位空间的位?

2024-04-04

我有一长串 0 到 67600 之间的数字。现在我想使用一个 67600 个元素长的数组来存储它们。如果某个数字在集合中,则该元素设置为 1;如果该数字不在集合中,则该元素设置为 0。 IE。每次我只需要 1 位信息来存储数字的存在。 C/C++ 中是否有任何 hack 可以帮助我实现这一目标?


在 C++ 中你可以使用std::vector<bool>如果大小是动态的(这是一个特殊情况std::vector, see this http://www.cplusplus.com/reference/vector/vector-bool/)否则有std::bitset(更喜欢std::bitset如果可能的话。)还有boost::dynamic_bitset如果您需要在运行时设置/更改大小。你可以找到相关信息here http://www.boost.org/doc/libs/1_36_0/libs/dynamic_bitset/dynamic_bitset.html,真是太酷了!

在 C(和 C++)中,您可以使用按位运算符手动实现这一点。常见操作的一个很好的总结是here http://en.wikipedia.org/wiki/Bit_manipulation#Bit_manipulation_in_the_C_programming_language。我想提的一件事是,在进行位运算时使用无符号整数是个好主意。<< and >>移位负整数时未定义。您将需要分配某种整数类型的数组,例如uint32_t。如果你想存储N位,这将需要N/32这些uint32_ts. Bit i存储在i % 32的第 1 位i / 32'th uint32_t。您可能希望根据您的体系结构和其他约束使用不同大小的整数类型。Note:更喜欢使用现有的实现(例如,如 C++ 的第一段中所述,在 Google 中搜索 C 解决方案)而不是自行实现(除非您特别想要,在这种情况下,我建议在解决问题之前从其他地方了解更多有关二进制/位操作的信息这个。)这种事已经做死了,也有“好”的解决办法。

有很多技巧可以maybe仅消耗一位:例如位域数组(也适用于 C),但是否使用更少的空间取决于编译器。看这个链接 http://msdn.microsoft.com/en-us/library/yszfawxh%28v=vs.80%29.aspx.

请注意,无论你做什么,你几乎肯定永远无法使用exactlyN 位来存储 N 位信息 - 您的计算机很可能无法分配少于 8 位:如果您想要 7 位,您将不得不浪费 1 位,如果您想要 9 位,您将不得不占用 16 位并浪​​费其中 7 个。即使您的计算机(CPU + RAM 等)可以在单个位上“运行”,如果您在操作系统中运行malloc/new由于开销,分配器以如此小的精度跟踪数据是不明智的。最后一个资格条件非常愚蠢——我想你不会找到一个允许你一次操作少于 8 位的架构:)

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

C hack 用于存储占用 1 位空间的位? 的相关文章

  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 如何计算 3D Morton 数(交织 3 个整数的位)

    我正在寻找一种快速计算 3D Morton 数的方法 这个网站 http www graphics stanford edu seander bithacks html InterleaveBMN有一个基于幻数的技巧来处理 2D Morto
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 在一次搜索中搜索 LDAP 上的用户和关联组

    LDAP 新手 我们的 LDAP 的排列方式是 人员 和 组 人们拥有姓名 uid 和邮件等用户信息 这些组具有组名称和多个成员字段 其值如 cn First Last cn people dc comic dc com 列出了该组成员的人
  • 在其声明之上调用函数

    void foo bar error bar has not been declared void bar namespace N void foo N bar error bar is not a member of N void bar
  • Visual Studio Code:.git 文件夹/文件隐藏

    我现在正在尝试 Visual Studio Code 关于 Visual Studio Code 的所有内容对我来说都非常酷 除了一件事 git 文件夹 文件隐藏在 Visual Studio Code 中 我经常通过修改 git配置文件
  • 如何在不复制粘贴的情况下以相同的方式扩展两个类?

    我写了一个楼主画的TabControl 但是我们的项目也使用了TabWorkspace其源自TabControl 此刻 我有 public class OurTabControl TabControl some code that over
  • 如何在窗口栏中获取菜单?

    我想知道如何在窗口栏中获取菜单 就像 Visual Studio 一样 如果能够在左侧显示 文件 编辑 等按钮 在右侧显示标准的 最小化 最大化 和 关闭 按钮 那就太好了 这是可能吗 我尝试过设置Window WindowStyle No
  • Android Intent Data Uri 查询参数

    我正在尝试使用如下意图启动我的应用程序 adb shell am start a android intent action VIEW d my scheme my host queryParam1 QueryParam1 queryPar
  • Xcode 8 无法导出 Ad Hoc 发行版的存档版本

    当我尝试在 Xcode 8 中导出存档应用程序以进行临时分发时 我收到一条错误消息 有没有匹配的配置文件 and 现有的配置文件缺乏应用程序标识符和钥匙串访问组权利 有什么问题吗 我怎样才能让它发挥作用 我尝试在开发人员会员中心生成临时分发
  • CoreData 和 mergeChangesFromContextDidSaveNotification

    我正在创建一个addingManagedObjectContext 作为新实体的便笺簿区域 然后在 保存 时将新实体合并到我的主 ManagedObjectContext 中 类似于 CoreDataBooks 示例中的显示方式 合并新实体
  • AWS Amplify Graphql 对 @connection 的查询

    我正在使用 AWS Amplify 前端使用 Cli 和 Angular 7 进行 Graphql AppSync 并且想知道当超过 10 个项目时如何获取所有连接的项目 假设我创建了一个这样的 schema graphql type Us
  • 为什么这个 Lua 优化 hack 会提高性能?

    我正在寻找一个描述提高 Lua 性能的各种技术的文档 http www lua org gems sample pdf脚本代码 我很震惊竟然需要这样的技巧 虽然我引用的是 Lua 但我在 Javascript 中也见过类似的 hack 为什
  • 仅重写 URL 的中间部分 - mod rewrite .htaccess

    我想改变cadeaushopurl 中的部分hobby cadeau shop 我在 htaccess 文件中进行了以下 mod 重写 RewriteRule cadeaushop http www zovyo nl hobby cadea
  • 如何在控制器中控制页面路由?

    OnsenUI 很棒 快速又简单 然而 关于控制器中控制温泉逻辑的文档并不多 例如 我想在控制器内执行 location path newpath 泡温泉是怎样做的 我尝试了 ons navigator pushPage partials
  • FFmpeg:如何估计音频流中的样本数量?

    我目前正在编写一个小型应用程序 它利用 FFmpeg 库来解码 C 中的音频文件 尤其是 avformat 和 swresample 现在我需要音频流中的样本总数 我知道确切的数字只能通过实际解码所有帧才能找到 我只需要一个估计 这里的首选
  • MouseListener 被多次调用

    我使用此代码来获取作为 jLable 图标放置的图像的 X 和 Y 坐标 对此的答案建议了这种获取坐标的方法question https stackoverflow com questions 19977589 how to get x y
  • HashMap 可串行化

    HashMap实现了Serialized接口 所以可以序列化 我查看了 HashMap 的实现 并且 Entry 表被标记为瞬态 由于Entry 表是存储Map全部内容的表 如果不能序列化 那么反序列化时Map是如何构造回来的 如果你看来源
  • Matplotlib 3D绘图zorder问题

    我有一个由蓝色表面组成的图 通过绘制plot surface 和一个红色球体 通过绘制scatter 曲面的 zorder 设置为 0 球体的 zorder 设置为 1 尽管不设置任何 zorder 值会产生相同的结果 You can se
  • 如何使用 Rails 和 Paperclip 将照片存储在 Google Cloud Storage 上?

    到目前为止 我一直使用 Amazon S3 来存储用户的文件 这里需要做的就是 指定存储桶的 Amazon S3 凭证 add aws sdk gem 到 Gemfile 并在模型中 has attached file avatar sty
  • 如何将 gdb 附加到 docker 容器中运行的进程?

    我在 docker 容器中有一个长时间运行的进程 我想将 gdb 附加到该进程以查看正在运行的线程并获取堆栈跟踪 我可以从主机附加到进程 但无法解析任何符号 因为可执行文件位于文件系统中的不同位置 位于 docker 安装的卷中 并且共享系
  • 将 void 指针转换为 float*/int* 时取消引用

    A int i 10 void p i printf f n float p B float i 10 00 void p i no change printf d n int p 为什么 A 打印 0 0 而不是 10 0 如果我们把A改
  • C hack 用于存储占用 1 位空间的位?

    我有一长串 0 到 67600 之间的数字 现在我想使用一个 67600 个元素长的数组来存储它们 如果某个数字在集合中 则该元素设置为 1 如果该数字不在集合中 则该元素设置为 0 IE 每次我只需要 1 位信息来存储数字的存在 C C