【问题标题】:Design for Bit manipulation位操作设计
【发布时间】:2017-01-12 23:03:52
【问题描述】:

我正在创建一个插件。我有一组不同类型的记录值。因此,可以说,对于每条记录,我都有以下数据

  • 类型:值
  • A : a1
  • B : b1
  • C : c1
  • D : d1

现在,对于每条记录,我想保留一个应用数组 -

  • 类型:应用
  • 答:是的
  • B:错误
  • C:真
  • D : 是的

现在,我对应用数组中的 A、B、C、D 的所有值取 &&,并根据最终 AND 的真/假判断记录是否有效。

现在,我不想为这样的事情保留和阵列。我想用 0/1 值保留 4 位,并使用更快的按位运算来取 '&'。我想知道如何实现这样的事情? n 位变量会是什么样子。

我正在创建一个插件,所以我不会提前知道是否会有 4 个这样的类型。可以有任何“n”个这样的类型(n

这是目前为止的想法

  1. 我将保留值 = 0 的整数变量。(所有位都为 0 最初)我不知道如何保持 32 位 / n 位的整数。
  2. 我会记录我有多少 n 种类型
  3. 要设置为真,我必须以某种方式将第 i 位设置为 1,或者 如果我必须将其设置为 false,则为 0。我不知道该怎么做。
  4. 要找到 AND,我会在那些中找到等于 0 的第一位 n 位。如果有 0,我的最终值为 0,否则为 1。

语言 - javascript/jquery

任何仅具有函数签名的示例都会有所帮助

【问题讨论】:

  • 您可能想在 javascript 中查看 bitwise operators。 IDK 如果这是一个合适的来源,到目前为止还没有用 javascript 工作那么多。
  • 感谢@Paul 的帮助。

标签: javascript jquery algorithm bit-manipulation


【解决方案1】:

我将保留 value = 0 的整数变量。(所有位最初都是 0)我不知道如何保留 32 位/n 位的整数。

JavaScript 没有整数类型,但Number 类型保证能够表示从−2³¹ 到 2³¹−1 的任何整数。您可以在 Number 上使用 bitwise operators,就好像它们是 32 位有符号整数一样。

要设置为 true,我必须以某种方式将第 i 位设置为 1,如果必须将其设置为 false,则设置为 0。我不知道该怎么做。

为了将i 的第x 位设置为1,请执行以下操作:

x |= (1 << i)

为了将x 的第i 位设置为0,请执行以下操作:

x &= ~(1 << i)

要找到 AND,我将在这 n 位中找到等于 0 的第一位。如果有 0,我的最终值为 0,否则为 1。

有一种更简单的方法可以检查整数 x 是否等于二进制中的 n

var isAllOnes = x === (1 << n) - 1;

n == 8 的示例:

(1 &lt;&lt; n) 是 256,或二进制的 100000000(一个和 8 个零)。

(1 &lt;&lt; n) - 1 是 255,或二进制的 11111111(8 个)。

【讨论】:

  • 这很有帮助。我将尝试实施它。非常感谢!
  • 谢谢。这非常有效。我不知道我可以使用数字(整数)来执行按位运算。 (跛脚)
【解决方案2】:

Javascript 具有用于左移的常用&lt;&lt; 运算符,因此1 &lt;&lt; n 将为您提供一个设置了第n 位的数字。 (这对于较大的n 无法正常工作,但n031 的范围内应该没问题,您在问题中声称对您来说足够大。)

您可以使用按位或运算符| 对此进行设置;例如x | 1 &lt;&lt; nx 类似,但设置了 nth 位。类似地,~&amp; 可用于关闭位:x &amp; ~(1 &lt;&lt; n) 将与 x 一样,但清除了 nth 位。

测试所有位是否已设置也相当容易:x === (1 &lt;&lt; n)-1 将检查从0n-1 的所有位是否都已设置。

【讨论】:

  • 不是 javascript 专家,但 AFAIK javascript 支持位移位。那么为什么要在pow 上浪费时间呢?似乎效率很低,对我来说并不完全具有描述性。
  • @Paul 谢谢!我也不是专家,基本上做了几秒钟的谷歌搜索,我在按位运算的名称上找到的第一个资源没有提到位移。不过,您是对的,支持位移,我会相应地更新我的答案。
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多