【问题标题】:binary check for an operation操作的二进制检查
【发布时间】:2019-02-28 17:22:23
【问题描述】:

假设一个班级有 n 名学生要参加考试。
我们打算设计出最快的方法来查明是否所有学生都参加了考试。
由于状态存储在存储库中 - 读取和更新操作成本很高。
这是否可以通过位移/切换来实现。
如果 n=5,则初始状态为 n 个字节的 0 - 00000
每个完成考试的学生从右边开始推 1。

 00001
 00011
 00111

......

所有由 1 组成的字节表示闭包。
我们如何使用位操作来实现这一点?
有没有更有效的方法来实现这一点?

【问题讨论】:

  • 为什么不在考试通过时使用递增的数字?

标签: bit-manipulation bit bit-shift


【解决方案1】:

您已经完成了所有步骤:

n 0:

status = 0

每个完成考试的学生从右边开始推 1。

status = status << 1  # push previous to left
status = status | 1    # set the lowest bit

所有由1组成的字节表示闭包。

allOnes = (1<<num_students) -1
closure = (status == allOnes)

有没有更有效的方法来实现这一点?

@Alain 的评论是正确的:您描述的方法只是从 1 计数到 n 的一种内存效率较低的方法。为什么不使用简单的计数器呢?

takers +=1
completed = (takers == num_students)

此存储将占用 lg(n) 位而不是 n 位。在任何一种情况下,每个接受者都会有加载/修改/测试/存储周期,因此不会节省大量时间。我能想到使用位域的唯一原因是,如果您担心一个人可能会参加两次测试并丢掉您的计数。

【讨论】:

  • 在多线程情况下这似乎是一种更好的方法 - 计数器总是可疑的。
  • 您提出的方法只是具有相同问题的另一种计数器。在读取和写入之间中断的线程可能会写入过时的修改数据。但是,如果您的存储库具有原子“setbit”操作,则可以通过为每个应试者设置 (1
猜你喜欢
  • 2014-01-07
  • 1970-01-01
  • 2011-10-01
  • 2021-07-25
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多