我想请求帮助解释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
谢谢。
答案 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之外的其他内容
我希望这有帮助,我认真地认为这个程序不应该做什么,但是这应该可以让你深入了解实际发生的事情