i += i & -i;的结果是什么
时间: 2024-06-21 20:02:34 浏览: 17
i += i & -i; 是一种常见的树状数组或者二进制索引树(Binary Indexed Tree)的实现方式,它的作用是将 i 最后一个非零位及其后面的所有位加1。该操作可以用于树状数组的更新和查询。
例如,对于 i = 6 (110b),i & -i = 2 (010b),所以 i += i & -i 的结果是 i = 8 (1000b)。
相关问题
int alert(SqList *L){ int i; for(i=0;i<L->length;i++){ if(L->O2[i] >= 1 && L->rou[i] >= 2 && L->ORP[i] >= 3 && L->PH[i] <= 4 && L->dirt[i] >= 5) { strcpy(L->pre[i],"轻度污染"); // 轻度污染 } else strcpy(L->pre[i],"重度污染"); // 重度污染 } for(i=0;i<L->length;i++) { printf("第%d个点的污染情况为:%s\n",i+1,L->pre[i]); } printf("\n"); }将上述代码修改正确
代码中存在两个问题:
1. 函数返回类型为 int,但是没有返回值,需要修改为 void。
2. 函数体中两个 strcpy 函数中的目标字符串数组大小没有确定,需要确定大小或使用动态分配内存的方式。
修改后的代码如下:
```
void alert(SqList *L){
int i;
for(i=0;i<L->length;i++){
if(L->O2[i] >= 1 && L->rou[i] >= 2 && L->ORP[i] >= 3 && L->PH[i] <= 4 && L->dirt[i] >= 5)
{
strncpy(L->pre[i],"轻度污染", MAX_STRING_SIZE); // 轻度污染
}
else strncpy(L->pre[i],"重度污染", MAX_STRING_SIZE); // 重度污染
}
for(i=0;i<L->length;i++)
{
printf("第%d个点的污染情况为:%s\n",i+1,L->pre[i]);
}
printf("\n");
}
```
其中,MAX_STRING_SIZE 为预先定义的目标字符串数组的最大长度。另外,可以使用 strncpy 函数代替 strcpy 函数以确保字符串拷贝的安全。
for(int+i+=+1;+i+<=+n;+++i)+//预先算出log_2(i)+1的值,用的时候直接调用就可以了 ++lg[i]+=+lg[i-1]+++(1+<<+lg[i-1]+==+i)
这段代码是一个循环,循环变量为i,初始值为1,每次循环i加1,直到i大于n为止。循环体内有两个操作,第一个是将lg[i]加上lg[i-1]的值,第二个是判断1+2^(lg[i-1])是否等于i,如果相等则将lg[i]再加1。其中lg是一个数组,表示以2为底的对数。这段代码的作用是预先算出每个i的以2为底的对数加1的值,方便后续调用。
```java
for(int i=1; i<=n; ++i) {
++lg[i];
lg[i] += lg[i-1];
if((i & (i-1)) == 0) {
++lg[i];
}
}
```