n&(1<<i)的含义

1<<i 是将1左移i位,即第i位为1,其余位为0;

例如1<<2 则0001->0100


n&(1<<i)是将左移i位的1与n进行按位与,即为保留n的第i位,其余位置零

如果n第i位为0,则n&(1<<i)的值为0

否则不为0

常用if(n&(1<<i)==0)用于判断n的第i位是否为0


### 关于 `for` 循环中逻辑运算符 `&amp;&amp;` 的用法与行为 在 C 或类似的编程语言中,`for` 循环通常用于迭代执行一段代码多次。当在 `for` 循环的条件部分使用逻辑运算符 `&amp;&amp;` 时,需要注意其行为以及可能引发的问题。 #### 条件表达式的布尔性质 逻辑运算符 `&amp;&amp;` 要求其操作数应为有效的布尔值[^1]。这意味着,在 `for` 循环的条件部分中使用的任何表达式都应当能够被解释为布尔值(即真或假)。如果条件中的某些子表达式不是布尔类型的,则可能会导致意外的行为或编译器警告/错误。 例如,考虑以下代码片段: ```c int i = 0; for (; (i++ &amp;&amp; i &lt; 5); ) { printf(&quot;%d\n&quot;, i); } ``` 在此例子中,`(i++ &amp;&amp; i &lt; 5)` 是一个复合条件。由于 `i++` 并不是一个严格的布尔表达式,而是返回整数值的结果,因此这种写法虽然语法上可能是合法的,但在实际应用中容易引起混淆和潜在问题。 #### 短路评估的影响 另一个重要方面是短路求值(short-circuit evaluation),这是指一旦可以确定整个逻辑表达式的最终结果而无需计算剩余的操作数时就会停止进一步计算。对于 `&amp;&amp;` 运算符来说,只要左侧操作数为 false,右侧就不会被执行。这可能导致依赖右边副作用(side effect)的情况出现问题。 继续上面的例子,假设我们修改一下循环条件如下所示: ```c int j = 10, k=20; for(int i=0; i&lt;3 &amp;&amp; (j /=k , j&gt;0); ++i){ ... } ``` 这里 `(j /=k , j&gt;0)` 中逗号 `,` 表达式先做除法再判断大小关系作为整体的一个布尔值参与逻辑与运算。然而因为存在短路特性,假如前面某个时刻 `i&lt;3` 不成立的话,那么后面的除法根本不会发生,从而影响程序预期功能实现. #### 避免八进制常量带来的隐患 另外值得注意的是,在涉及数字字面量定义或者初始化变量时候要小心不要误用了八进制形式表示数据除非确实必要并清楚了解它含义及其局限性[^2]. 如果不小心把十进制理解成了八进制来设置初始状态参数给到含有复杂控制流结构像嵌套多层if else加for组合场景下就很容易埋藏难以察觉缺陷. ```c // 错误示范 - 使用了隐含意义不明的八进制数 for(int idx=077; /*...*/ ){ //... } // 正确做法应该是显式指定基数前缀如十六进制&#39;0x&#39; for(int idx=0xFF; /*...*/ ){ //... } ``` 综上所述,在编写带有逻辑运算符 `&amp;&amp;` 的 `for` 循环时需特别留意上述几点事项以确保代码清晰易读且无隐藏风险。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值