c++ for循环中的布尔运算符

boolean operator in for loop in c++

本文关键字:布尔 运算符 for 循环 c++      更新时间:2023-10-16

我知道如何用Java编程,但我正在努力学习c++。我试着做一些比赛,他们给你一个算法,你试着用任何你想用的语言来解决它。

我被困在一个算法和搜索中,我发现这段代码可能对我有帮助,但我对for循环语句的最后一部分有点困惑

  int N,K;
  scanf("%d %d",&N,&K);   
  for(int j = 0,x;j<N;++j){
          scanf("%d",&x);
          x = N+1-x;
          for(int idx = x-1;idx>0;idx -= (idx & -idx)) aux2 += T[idx];

我在部分感到困惑:

idx -= (idx & -idx)

我知道"-="等价于:

idx = idx - (idx & -idx)

,我知道"&"是逻辑运算与但是我不知道怎么用布尔值来操作整数…对于像我这样的Java人来说,这有点令人困惑。

我想知道是否有人能帮我一下。

表达式idx -= (idx & -idx)设置idx中1到0的最低位。

例如10001010010 ==> 10001010000。

所以上面循环的迭代次数等于idx中1的次数。

顺便说一句,执行此操作的更简单的方法是使用idx &= idx-1

SWAR算法被认为是计算1个数最有效的方法。

位运算符可以很好地操作其实参的每一位。特别地,&应用AND运算符,因此一个例子(对于4位参数)将是

  0101
& 1011
------
  0001

你混淆了位运算符和布尔运算符

  • operator &二进制(又名) AND运算符。在整数的情况下,它对每个位进行与操作。例如:1 & 2 = 0
  • operator &&布尔和运算符(又称逻辑与)。在c++中,它接受两个值(不仅是bool, int s也可以),并检查它们是否都是true(在整数的情况下-不等于0)。

在c++中,idx && -idx也是合法的,如果idx不是0,它将等于true,但它不会像当前版本那样做。