按位代码解释

时间:2018-06-16 22:51:19

标签: c++ arrays bitwise-operators

我想请求帮助解释C ++中的代码。

#define bit(b) (1 << (b)) // I do not understand the operation.
#define contains(n, b) ((n) & bit(b)) // I do not understand the operation.

 #define MAXV 26

using namespace std;


vector<int> vars;
int deps[MAXV];

string curr;

   void printOrderings(int used, int usedSize) {
  if(usedSize == (int) vars.size()) {
    cout << curr << endl; return;
  }
  for(int i = 0; i < (int) vars.size(); i++) {
    int v = vars[i];
    if(!contains(used, v) && ((used & deps[v]) == deps[v])) {
      curr.push_back(v + 'a');
      printOrderings(used | bit(v), usedSize + 1);
      curr.erase(curr.end() - 1);
    }
  }
}


int main() {
    int tc = 0;
    string line;

    while(getline(cin, line)) {
        if(tc++)
            cout << endl;

        vars.clear();
        for( int i = 0 ; i < (int) line.length() ; i += 2 ) {
            vars.push_back( line[i] - 'a' );
            deps[ line[i] - 'a' ] = 0;
        }
        sort( vars.begin(), vars.end() );

        getline(cin, line);

        for( int i = 0 ; i < (int) line.length() ; i += 4 )
            deps[ line[ i + 2 ] - 'a' ] |= bit( line[ i ] - 'a' ); //I do not understand the operation.

        printOrderings(0, 0);
    }

    return 0;
}

对于输入类似的问题:

a b f g

a b b f

v w x y z

v y x v z v w v

我不明白定义如何工作(bit,contains)按位使用。以及 deps 数组如何工作。

你能帮我一把吗?

代码是解决问题的可能方法:https://uva.onlinejudge.org/external/1/p124.pdf

谢谢。

1 个答案:

答案 0 :(得分:0)

#define bit(b) (1 << (b))

这将&#34;返回&#34; (&#34;因为它在技术上只是一个宏)一个32位整数,其中只有&#34; b&#34;位为1而其余为0

想象一下二进制的32位数字格式,如下所示:

  <00> 0000 0000 0000 0000(12月0日)

现在(b)真正做的是移位

  <00> 0000 0000 0000 0001(dec 1)

&#34; B&#34;左边的时间。

所以,如果我们做位(4),我们将得到

  <00> 0000 0000 0001 0000(12月16日)

#define contains(n, b) ((n) & bit(b)) // I do not understand the operation.

这将由编译器默认返回位(b)或0,具体取决于n是否具有从右侧开启的&#34; b&#34;位。这意味着如果你尝试包含(15,2),二进制文件中它们看起来像这样

  <00> 0000 0000 1111(12月15日)   / 0000 0000 0000 0100(dec 4 - 1两次向左移动)

你可以通过将两个数字写在彼此之下来轻松地完成二进制运算,如&amp;,|,^(AND,OR,XOR),所以15&amp;二进制4将如下所示:

0000 0000 0000 1111

0000 0000 0000 0100 &
__________________
0000 0000 0000 0100 (again, dec 4)

如果您想知道C / C ++中的定义是如何工作的,它们依赖于您使用的编译器,在Microsoft Visual C ++编译器上,它们被解释为只是复制粘贴&#34;定义的&#34;将内容放到使用宏的地方,在基于linux的编译器上,他们通常会做一些错误检查(我在一个小的层面上遇到了我的麻烦),但工作方式几乎类似于前面提到的基于窗口的一个。

现在&#34; deps&#34;部分是棘手的,因为我们不知道这实际上是什么。你必须更多地描述它。但是使用你的字符串&#34; a b f g&#34;在

for( int i = 0 ; i < (int) line.length() ; i += 4 )
    deps[ line[ i + 2 ] - 'a' ] |= bit( line[ i ] - 'a' ); 

会给出这些行

deps[line[0+2]-'a'] |= bit(line[0]-'a']
deps[line[4+2]-'a'] |= bit(line[4]-'a']



deps['b'-'a'] |= bit('a'-'a']
deps['g'-'a'] |= bit('f'-'a']



deps[1] |= bit(0)
deps[6] |= bit(5)


deps[1] |= 1
deps[6] |= 32 //remember 0000 0000 0010 0000

并且由于之前所有deps []项都已设置为0,在此示例中,除1和6外,所有数组项均为0,设置为1和32。

| =除了设置右侧1和运算符左侧1之外的其他内容

我希望这有帮助,我认真地认为这个程序不应该做什么,但是这应该可以让你深入了解实际发生的事情