c++ - JavaScript 位操作到 C++ 位操作

标签 c++ bitwise-operators

以下伪代码和 JavaScript 代码是算法实现的摘录,我想将其转换为 C++。

伪代码:

for b from 0 to 2|R| do
for i from 0 to |R| do
if BIT-AT(b, i) = 1 then // b’s bit at index i

JavaScript 代码:

for (var b = 0; b < Math.pow(2, orders[r].length); b++) // use b's bits for directions
   {
   for (var i = 0; i < orders[r].length; i++)
    {
    if (((b >> i) & 1) == 1) {  // is b's bit at index i on? 

我不明白这段代码的最后一行发生了什么,上面给出的 JavaScript 代码的 C++ 代码应该是什么。到目前为止我写的是:

for (int b = 0; b < pow(2, orders.at(r).size()); b++) 
{
  for (int i = 0; i < orders.at(r).size(); i++)
    {
     if (((b >> i) & 1) == 1)***//This line is not doing what it is supposed to do according to pseudo code*** 

最后一行给我 segmentation fault 。

-- 编辑:我很抱歉问题出在其他地方,这段代码工作正常。

最佳答案

(((b >> i) & 1) == 1)
     |     |
     |     |
     |    bitwise AND between the result of the shift and number 1.
     |
    shift b by i bits to the right

然后将结果与数字 1 进行比较。

因此,例如,如果 b 是 8,而 i 是 2,它将执行以下操作:

  1. 将 8(即 00001000)向右移动 2 位。结果将为 00000100
  2. 应用按位与:00000100 BITWISE_AND 00000001,结果将为 0
  3. 将它与 1 进行比较。由于 0 =/= 1,您将不会输入最后一个 if

至于这背后的逻辑,代码 ((b >> i) & 1) == 1) 返回 true 如果位数 i b 变量的 1,否则为 false

我相信 c++ 代码会是一样的,除了我们在 c++ 中没有 Math 类,你必须替换 var s 具有相应的类型。

关于c++ - JavaScript 位操作到 C++ 位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11948166/

相关文章:

c++ - 编译器如何在结构中完成内存分配?

f# - 与 OCaml 的 'lsr' 和 'asr' 等效的 F# 按位运算符是什么?

c - 运算符优先级(按位 '&' 低于 '==' )

c - 大于 C 中的函数

java - 难以理解数字序列的按位与,提供的代码

c++ - 如何让 SonarQube Scanner 分析 C 和 C++ 代码?

c++ - C++ 构造函数中的字符串作为参数

c++ - Qt 从 QHBoxLayout 中删除拉伸(stretch)

c++ - 在程序员创建时自动将类型派生类(不是实例)添加到列表中。 C++

c++ - 使用位实现集合