解释代码(n&(n-1))==0的具体含义

1)(A&B)==0的含义

 

A和B的二进制表示的同一位置绝不会同为1。

 

2)n和n-1

若n的最低有效位为1,减去1后为0,其余为均相同,不符合要求。n的最低有效位为0,减去1时,必须向高位借1。

 

3)(n&(n-1))==0的含义

假设 n = 5,二进制表示为101,那么 n-1 = 4,二进制表示为100, 5 & 4 = 101 & 100 = 100 = 4 != 0,下面我们来看更多的例子:

5 & 4 = 101 & 100 = 4
 6 & 5 = 110 & 101 = 4
 7 & 6 = 111 & 110 = 6
 8 & 7 = 1000 & 0111 = 0

我们会发现要使表达式等于0,n-1必须使得n的n-1都向高位进1,也就是说满足一下条件:

x + 1 = n
 x & n = 0

我们来看看有那些数能满足要求:

10 & 01 = 0   -------2^1
100 & 011 = 0  -------2^2
1000 & 0111 = 0  -------2^3
10000 & 01111 = 0  -------2^4
。。。。。。

所谓代码((n & (n-1))== 0)的含义是n满足2的n次方

n的最高有效位为1,其余位为0。因此,n的值是2的某次方。

所以,(n&(n-1))==0检查n是否为2的某次方(或者检查n是否为0

转载于:https://my.oschina.net/u/2822116/blog/790384

这段代码实现了一个循环链表中按照一定规则删除节点的功能。具体来说,函数接收三个参数,分别是指向循环链表头节点的指针p, 数组m和n。 函数的实现思路是,首先判断m是否为1,如果是,则单独处理,将从p开始的n个节点输出,并删除这些节点。如果m不为1,则从p开始向后遍历链表,每遍历m个节点就删除一个节点,输出该节点的值。需要注意的是,当链表中只剩下一个节点时,直接输出该节点的值即可。 这段代码的实现过程比较简单,但存在一些问题。首先,函数的参数m和n并没有被充分利用,只用到了m和n的值,并没有考虑它们的含义。其次,函数中使用了大量的if语句和continue语句,使得代码的可读性和可维护性较差。最后,函数中没有对边界情况进行充分考虑,可能会导致程序的运行错误。 因此,如果我要对该函数进行改进,我会考虑以下几点: 1. 修改函数的参数,使得函数更加通用。比如可以将m和n改为表示每次删除m个节点,删除n次的参数,这样可以更好地反映函数的含义。 2. 简化函数中的if语句和continue语句,使得代码更加简洁易读。可以考虑使用while循环来替代if语句。 3. 对边界情况进行充分考虑,在代码中加入必要的容错处理,避免程序运行错误。 4. 可以考虑利用模板来实现该函数,使得函数可以处理不同类型的数据。 通过以上改进,可以使得函数更加通用、易读、健壮,并且可以处理不同类型的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值