SW练习_lowbit函数

本文深入解析了lowbit()函数的工作原理,通过实例展示了如何计算一个数的最低位1及其后续0的值。同时,文章探讨了lowbit()在树状数组中的关键作用,包括节点覆盖长度、父节点与左侧节点的确定方法,为理解树状数组提供了清晰的路径。

lowbit() 代表的是最后的1和1后面0的值
比如
lowbit(44) -> (101100) ->(100) ->4
lowbit(n)=n&(-n+1)
推算过程如下:
还是以44为例
44           101100
-44          010011
-44+1        010100
44&(-44+1) 000100

lowbit(n)=n&(-n+1)

 

在树状数组里

经过观察发现每一层末尾的0的个数都是相同的,0个个数与其覆盖的长度有关

t[n]覆盖的长度就是lowbit(n)

n节点的父亲节点 t[n] 为 n+lowbit(n)  这块很神奇

n节点的左侧节点 l[n] 为 n-lowbit(n)

参照网址:https://www.bilibili.com/video/BV1pE41197Qj?from=search&seid=11168892266722482523

### C语言中 `lowbit` 函数的实现 在C语言中,`lowbit` 函数用于获取一个整数最右边的第一个1所代表的数值。该函数可以通过按位与操作来高效地完成这一任务。 #### 实现方法 一种常见的实现方式是利用正数与其负数之间的关系: ```c int lowbit(int x) { return x & (-x); } ``` 这段代码通过将输入值 `x` 和其取反加一后的结果 `-x` 进行按位与运算,从而得到最低有效位上的1[^2]。 另一种思路是从原始值中移除最低的有效位并将其从原值中减去: ```c int lowbit(int n) { return n - (n & (n - 1)); } ``` 这种方法同样可以达到相同的效果,即找到给定整数中最右侧第一个出现的'1'。 #### 应用实例 下面是一个简单的程序片段展示如何使用上述定义好的 `lowbit` 来检测某个特定位置是否有设置标志位以及计算二进制串中有多少个连续零之前遇到的第一个‘1’的位置。 ```c #include <stdio.h> // 定义lowbit函数 int lowbit(int x) { return x & (-x); } void checkPowerOfTwo(int num){ if(lowbit(num)==num && num!=0) printf("%d 是2的幂\n",num); else printf("%d 不是2的幂\n",num); } int main(){ int testNums[] = {8,7,-4}; for(size_t i=0;i<sizeof(testNums)/sizeof(*testNums);i++){ int result = lowbit(testNums[i]); printf("对于 %d 的lowbit结果为:%d \n",testNums[i],result ); // 判断是否为2的幂次方 checkPowerOfTwo(testNums[i]); } return 0; } ``` 此段代码不仅实现了 `lowbit` 功能还展示了它的一个实际应用场景——检验一个数字是不是2的幂次方[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值