如何在 C 中定义和使用位数组?

2024-01-17

我想创建一个非常大的数组,在上面写入“0”和“1”。我正在尝试模拟一种称为随机顺序吸附的物理过程,其中长度为 2 的二聚体单位沉积在 n 维晶格的随机位置上,且彼此不重叠。当晶格上没有足够的空间来沉积更多二聚体时(晶格被堵塞),该过程就会停止。

最初,我从零格开始,二聚体由一对“1”表示。当每个二聚体沉积时,由于二聚体不能重叠,二聚体左侧的位点被封闭。所以我通过在晶格上沉积三个“1”来模拟这个过程。我需要多次重复整个模拟,然后计算出平均覆盖率%。

我已经使用一维和二维晶格的字符数组完成了此操作。目前,在处理 3D 问题和更复杂的概括之前,我正在尝试使代码尽可能高效。

这基本上就是一维代码的样子,经过简化:

int main()
{
    /* Define lattice */
    array = (char*)malloc(N * sizeof(char));

    total_c = 0;

    /* Carry out RSA multiple times */
    for (i = 0; i < 1000; i++)
        rand_seq_ads();

    /* Calculate average coverage efficiency at jamming */
    printf("coverage efficiency = %lf", total_c/1000);

    return 0;
}

void rand_seq_ads()
{
    /* Initialise array, initial conditions */
    memset(a, 0, N * sizeof(char));
    available_sites = N;
    count = 0;

    /* While the lattice still has enough room... */
    while(available_sites != 0)
    {
        /* Generate random site location */
        x = rand();

        /* Deposit dimer (if site is available) */
        if(array[x] == 0)
        {
            array[x] = 1;
            array[x+1] = 1;
            count += 1;
            available_sites += -2;
        }

        /* Mark site left of dimer as unavailable (if its empty) */
        if(array[x-1] == 0)
        {
            array[x-1] = 1;
            available_sites += -1;
        }
    }

    /* Calculate coverage %, and add to total */
    c = count/N
    total_c += c;
}

对于我正在做的实际项目,它不仅涉及二聚体,还涉及三聚体、四聚体以及各种形状和尺寸(针对 2D 和 3D)。

我希望我能够使用单个位而不是字节,但我一直在阅读,据我所知,一次只能更改 1 个字节,所以我需要做一些复杂的索引或者有更简单的方法吗?

感谢您的回答


如果我来得不是太晚的话this http://www.mathcs.emory.edu/%7Echeung/Courses/255/Syllabus/1-C-intro/bit-array.html页面给出了很棒的解释和示例。

一个数组int可以用来处理数组bits。假设大小为int to be 4 bytes,当我们谈论一个int,我们正在处理32 bits。说我们有int A[10],意味着我们正在努力10*4*8 = 320 bits如下图所示:(数组的每个元素有4个大块,每个块代表一个byte每个较小的块代表一个bit)

因此,要设置k数组中的第 th 位A:

// NOTE: if using "uint8_t A[]" instead of "int A[]" then divide by 8, not 32
void  SetBit( int A[],  int k )
{
    int i = k/32;        //gives the corresponding index in the array A
    int pos = k%32;      //gives the corresponding bit position in A[i]

    unsigned int flag = 1;   // flag = 0000.....00001

    flag = flag << pos;      // flag = 0000...010...000   (shifted k positions)

    A[i] = A[i] | flag;      // Set the bit at the k-th position in A[i]
}

或缩短版本

void  SetBit( int A[],  int k )
{
    A[k/32] |= 1 << (k%32);  // Set the bit at the k-th position in A[i]
}

类似于清除kth bit:

void  ClearBit( int A[],  int k )                
{
    A[k/32] &= ~(1 << (k%32));
}

并测试是否kth bit:

int TestBit( int A[],  int k )
{
    return ( (A[k/32] & (1 << (k%32) )) != 0 ) ;     
}

如上所述,这些操作也可以写成宏:

// Due order of operation wrap 'k' in parentheses in case it
// is passed as an equation, e.g. i + 1, otherwise the first
// part evaluates to "A[i + (1/32)]" not "A[(i + 1)/32]"
#define SetBit(A,k)     ( A[(k)/32] |= (1 << ((k)%32)) )
#define ClearBit(A,k)   ( A[(k)/32] &= ~(1 << ((k)%32)) )
#define TestBit(A,k)    ( A[(k)/32] & (1 << ((k)%32)) )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C 中定义和使用位数组? 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • iPad Safari 将鼠标事件映射到图像映射中的触摸事件

    我的网站广泛使用图像地图 这些图像是中世纪手稿的页面 AREA 标签的 mouseOver 事件附加了一个工具提示 它显示了鼠标悬停在其上的行的古代文字的现代印刷转录 我刚刚在苹果商店的 iPad 上查看了我的网站 iPad 在很多方面使用
  • geom_boxplot():强制出现空级别

    我无法找到一种方法来要求 ggplot2 在箱线图中显示空级别 而不用实际缺失值填充我的数据框 这是可重现的代码 fake data dftest lt expand grid time 1 10 measure 1 50 dftest v
  • 如何计算直线和曲线的最近点? ..还是曲线和曲线?

    给定直线和二次贝塞尔曲线的点 如何计算它们的最近点 INRIA 有一篇关于这个问题的科学论文 计算两条贝塞尔曲线之间的最小距离 http hal inria fr inria 00518351 en PDF here http hal in
  • 是什么导致桌面屏蔽图标覆盖在*某些*桌面上

    我有一个 C Builder Delphi 应用程序 它具有作为资源嵌入的以下清单
  • 检测django模型中的HOST域名

    在我的模型中 我想使用我在视图中使用的域名 HOST 由于 请求 对象 在视图中这是可行的 但我该怎么办 这个模型方法 哪些不使用 HttpRequest 对象 现在我在 settings py 中设置一个全局值 HOST 并使用它 但那就
  • 使用 lkJSON 解析 JSON

    我有一个 JSON 文件 需要解析并提取一个值 user pk 25025320 username instagram full name Instagram is private false profile pic url https i
  • 实现时在 typescript 中找不到 OnInit

    我正在使用 loginComponent 开发一个示例项目 当我尝试添加 OnInit 时 我需要在我的类中实现 OnInit 但出现以下错误 ts 找不到 OnInit 这是我的代码 export class loginComponent
  • JSON.Stringify 将引号添加到 ID [重复]

    这个问题已经存在了 我正在使用 JSON stringify 和 JSON parse 根据对在线数据库的更改来编辑我的 JSON 文件 一切正常 除了在数字周围加上引号 这会搞乱 JSON 文件 例如应该是 id 1但它正在打印出来 id
  • java SwingWorker.doInBackground() 不得访问 GUI 元素

    也许这很微不足道 我正在努力理解一个简单的文档摇摆工人 http docs oracle com javase 6 docs api javax swing SwingWorker html 这是复制粘贴的内容 Workflow Swing
  • 在 IValueConverter 类中定义属性

    我需要在转换器类中定义 DependencyProperty 因为我需要此数据来进行转换 并且此数据位于另一个对象中 而不是我绑定到的对象中 我的转换器类如下 public class LEGOMaterialConverter Depen
  • 如何在tomcat访问日志中记录Client IP和X-Forwarded-For IP

    如何在 tomcat 访问日志中记录 Client IP 和 X Forwarded For IP 我正在使用 X Forwarded For i 如果我通过负载均衡器访问 它会记录实际的客户端地址 但如果我直接访问 tomcat 实例 则
  • 从 glmmTMB 类的 ZINB 模型生成预测计数分布

    在上一个问题中 R 中没有从 Zeroinfl 对象预测零 https stackoverflow com questions 22314921 no zeros predicted from zeroinfl object in r 有一
  • 这个“>>=”运算符在 C 中意味着什么?

    unsigned long set set is after modified set gt gt 1 我在内核系统调用中发现了这个 但我不明白 它是如何工作的 表达方式set gt gt 1 means set set gt gt 1 即
  • using 语句 - 它会触发垃圾收集吗?

    我想做的是包装一些可能在 using 语句中泄漏的可疑函数来触发垃圾收集 有人使用或见过这样的东西吗 这有效吗 您对此有何看法 using String wrapper new String maybe this will trigger
  • AGP 7.0.0-alpha15之后如何更改版本代码

    在 AGP 7 0 0 alpha15 之前 我可以更改应用程序的版本代码 例如这样 android defaultConfig applicationVariants all if buildType name debug outputs
  • Three.js 加载已三角化的网格是否比使用四边形的网格性能更高?

    我读过 Three js 对所有网格面进行三角剖分 这是正确的吗 然后我意识到我使用的大多数 gltf 模型都有四面体 在 Blender 中对面进行三角测量非常容易 所以我很好奇对面进行预先三角测量是否会导致网格加载更快 提前致谢 如果您
  • 如何使用 R 运行 ldap 查询?

    我想对 LDAP 目录进行查询 了解员工在部门和组中的分布情况 就像是 给我一个小组所有成员的部门名称 然后使用 R 进行频率分析 但我找不到任何有关如何使用 R 连接和运行 LDAP 查询的示例 RCurl 似乎有某种支持 http cr
  • JSF:将 A.jsf 设置为键入 mydomain.com 时要转到的默认页面

    现在 每次我打字mydomain com它会自动转到mydomain com projectname home jsf 这是我的登录页面 不知道为什么 我知道我仍在会话中 这意味着我可以导航到受限页面而无需再次登录 那么如果我输入的话我该怎
  • 尝试上传到 s3 时出现 InvalidAccessKeyId

    我正在使用aws sdk将文件上传到 s3 我正在配置我的凭据 aws config update accessKeyId aws config credentials accessKeyId secretAccessKey aws con
  • 如何在 C 中定义和使用位数组?

    我想创建一个非常大的数组 在上面写入 0 和 1 我正在尝试模拟一种称为随机顺序吸附的物理过程 其中长度为 2 的二聚体单位沉积在 n 维晶格的随机位置上 且彼此不重叠 当晶格上没有足够的空间来沉积更多二聚体时 晶格被堵塞 该过程就会停止