if ((x - 0x01010101) & (~x) & 0x80808080) 理解

这篇文章详细解析了(x-0x01)与(~x)按位与0x80的条件,指出只有当x为0时,if语句成立。同样,扩展到四个字节的情况,x的一个字节为0时条件成立。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

if ((x - 0x01010101) & (~x) & 0x80808080)

为了说明方便,可以将 x 看成只有一个字节,则上面的问题可以简化为

if ((x - 0x01) & (~x) & 0x80)

先看 0x80 对应二进制 0b1000,0000 与该字节进行按位取与,只有在 (x-0x01) 和 (~x) 第8位都为1的情况下,该 if 条件才会成立。
对于 (x-0x01) ,只有 x =0 或者 x>0x80,其第8位才为1。
对于 (~x) ,只有 x<0x80,其第8位才为1。
故只有 x = 0 时,if ((x - 0x01) & (~x) & 0x80) 才成立

对于 if ((x - 0x01010101) & (~x) & 0x80808080) , x 变量 4个字节中有一个字节为0,就成立

参考文献:

https://blog.csdn.net/ycnian/article/details/12950419

根据以下源码,分别详细分析BCM6756和BCM6764方案下,skb-&gt;mark和ct-&gt;mark的赋值逻辑 (1)举例,说明BCM6756和BCM6764下,mark的赋值逻辑 (2)判断BCM6756和BCM6764方案mark赋值是否相同?能够合并为一个方案? #define QOS_LAN_MARK_HIGH (0x3) #define QOS_WAN_MARK_HIGH (0x18000010) #define QOS_LAN_MARK_LOW (0x5) #define QOS_WAN_MARK_LOW (0x08000010) #define QOS_LAN_CT_MARK_HIGH (0X0030) #define QOS_LAN_CT_MARK_LOW (0X0020) BCM6756方案: static void set_qos_mark(struct sk_buff *skb, struct nf_conn *ct, u_int32_t mark) { #if CONFIG_BCM6756 u_int32_t mask = 0xFFFF; #else u_int32_t mask = 0xFFF0; #endif /*1. ct and skb use the same mark; */ /*2. --set-mark: */ /* mark = (mark AND NOT mask) OR value */ if (skb) { if (skb-&gt;mark != QOS_LAN_MARK_LOW &amp;&amp; skb-&gt;mark &gt; 0) { return; } else { skb-&gt;mark = (skb-&gt;mark &amp; ~mask) | mark; } } if (ct) { if (ct-&gt;mark != QOS_LAN_CT_MARK_LOW &amp;&amp; ct-&gt;mark &gt; 0) { return; } else { #if CONFIG_BCM6756 ct-&gt;mark = (ct-&gt;mark &amp; ~mask) | (mark == QOS_LAN_MARK_LOW ? QOS_LAN_CT_MARK_LOW: QOS_LAN_CT_MARK_HIGH); #else ct-&gt;mark = (ct-&gt;mark &amp; ~mask) | mark; #endif } } /*now let TC queue do the rest*/ return; } BCM6764方案: static void set_qos_mark(struct sk_buff *skb, struct nf_conn *ct, u_int32_t mark) { u_int32_t mask = 0xFFF0; #if CONFIG_BCM6764 u_int32_t skb_mask = 0x7; #endif if (skb) { if (skb-&gt;mark != GAMING_QOS_LAN_MARK_LOW &amp;&amp; skb-&gt;mark &gt; 0) { return; } else { #if CONFIG_BCM6764 skb-&gt;mark = (skb-&gt;mark &amp; ~skb_mask) | mark; #else skb-&gt;mark = (skb-&gt;mark &amp; ~mask) | mark; #endif } } if (ct) { if (ct-&gt;mark != QOS_LAN_CT_MARK_LOW &amp;&amp; ct-&gt;mark &gt; 0) { return; } else { &lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD #if CONFIG_BCM6764 ct-&gt;mark = (ct-&gt;mark &amp; ~mask) | (mark == QOS_LAN_MARK_LOW ? QOS_LAN_CT_MARK_LOW: QOS_LAN_CT_MARK_HIGH); #else ct-&gt;mark = (ct-&gt;mark &amp; ~mask) | mark; #endif } }
最新发布
07-16
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值