我知道如何使用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)
我知道“&amp;”是逻辑运算AND 但我不知道你怎么能用布尔运算一个整数...对于像我这样的java人来说这有点令人困惑。
我想知道是否有人可以帮助我。
答案 0 :(得分:3)
表达式idx -= (idx & -idx)
设置idx
中值为1到0的最低位。
例如,10001010010 ==&gt; 10001010000。
因此,上面循环中的迭代次数将等于idx
中的1次。
BTW,执行此操作的更简单方法是使用idx &= idx-1
。
SWAR Algorithm被认为是计算1的最有效方式。
答案 1 :(得分:2)
按位运算符在其参数的每个位上运行良好。特别是,&
应用AND运算符,因此一个示例(对于4位参数)将是
0101
& 1011
------
0001
答案 2 :(得分:2)
你是confusing使用布尔运算符的按位运算符。
operator &
是二进制(又名按位) AND 运算符。在整数的情况下,它对每个位执行AND运算。例如:1 & 2
等于0
。operator &&
是布尔值和运算符(又名逻辑AND )。在C ++中它需要两个值(不仅bool
,int
也会这样做),并检查它们是否都是true
(在整数的情况下 - 不等于{{ 1}})。在C ++中,0
也是合法的,如果idx && -idx
不是true
,它将是idx
,但它不会像当前版本。