x=x&(x-1)

party9ly 2005-10-05 04:19:26
x=x&(x-1)句话啥意思啊?
...全文
2760 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
A_Knuth_A 2005-10-10
  • 打赏
  • 举报
回复
注意当x&(x-1)用于速判x是否为2^n的前提是x为unsigned类型的变量.我手边也有nasi00(莫傲·逍遥)的帖中提到的<Hacker's Delight>这本书,中文译名为<<高效变程的奥秘>> ,其中有一节都是介绍关于类似于x&(x-1)的技巧代码,不失为一本好书.强烈推荐先!!!
deping_chen 2005-10-06
  • 打赏
  • 举报
回复
更正:
void swap(int i1, int i2)
改成:
void swap(int& i1, int& i2)
deping_chen 2005-10-06
  • 打赏
  • 举报
回复
位运算里有学问呀,
例如众所周知的交换算法:
void swap(int i1, int i2)
{
i1 ^= i2;
i2 ^= i1;
i1 ^= i2;
}
还有,我今天看了Minix操作系统作者写的《操作系统 设计与实现》(写的比William Stalling的《操作系统 内核与设计原理》有条理而且清晰紧凑得多,后者内容芜杂)中的页面替换算法之一矩阵法,就是用位运算实现的:
假设内存分为n页,那么高速缓存一个n x n的比特矩阵,开始时全置0,如下(假设n=4):
0 1 2 3
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
每次内存访问时,如果访问的是i页,那么先把矩阵的第i行置1,然后把矩阵的第i列置0,这样i行的二进制的值越小就表示i页最长时间最近没有被访问。例如假设访问的次序为0-2-3-1,那么该矩阵的变化过程为:
0 1 2 3
0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1
2 0 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0
3 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0
第三个例子是Windows GDI的二元和三元光栅操作的编码。比较复杂,就不讲了。
deping_chen 2005-10-06
  • 打赏
  • 举报
回复
x=x&(x-1)
==============
以前没有见过这样的表达式,分析一下发现发明这个表达式的人是个高手。
表达式的意思就是把x的二进制表示从最低位直到遇到第一个1的比特置0。
例如:
e1:
x = 01001000
x-1 = 01000111
x&(x-1)=01000000
e2:
x = 01001001
x-1 = 01001000
x&(x-1)=01001000
  • 打赏
  • 举报
回复
将最低的非0位以下的位置0。
以16位计
如:0x???????1->0x???????0
0x???10000->0x???00000
  • 打赏
  • 举报
回复
0x10000000会怎样?
epico 2005-10-06
  • 打赏
  • 举报
回复
antijpn(antijpn) 已经解释过了
epico 2005-10-06
  • 打赏
  • 举报
回复
如果我没有记错的话,此题是ms笔试时的一道题的一部分。
x&(x-1)可以快速判断此数是不是2^n,当x为2的n次幂的时候,结果为零。
x 00100 x-1 00011 x&(x-1) 00000
根据x-1只会把最后一位的100变成011的特殊性质,所以,该运算可以快速将最后一位的1变成0.
所以那道面试题,通过不断地进行此运算,可以快速的将该数中包含几个1算出来。
所以,该题问的是该数中有几个1.我用计算器算了一下,好像是8或9个,记不清了。
在PowerPC下,有方便的汇编指令,x86下只能通过这种方法来实现了。
A_Knuth_A 2005-10-06
  • 打赏
  • 举报
回复
deping_chen(小平) 是正确的,可以验证
ckp 2005-10-06
  • 打赏
  • 举报
回复
x=x&(x-1)句话啥意思啊?
很简单,就是将x与x-1进行按位的与运算。没有其他任何意思。
除非,你要用到的算法中,需要这个运算。
antijpn 2005-10-05
  • 打赏
  • 举报
回复
转新手乐园

就是把最低的为1的位变成0而已……
snowbirdfly 2005-10-05
  • 打赏
  • 举报
回复
那可以通过调试找出一点规律~~~
当 x = 0,结果为0
<0,0>,<1,0>,<2,0>,<3,2>,<4,0>,<5,4>,<6,4>,<7,6>,<8,0>,<9,8>,<10,8>,<11,10>,<12,8>,<13,12>,<14,12>,<15,14>,<16,0>,<17,16>,<18,16>,<19,18>,<20,16>,<21,16>,<22,20>,<23,22>,<24,16>,<25,24>,<26,24>,<27,26>,<28,24>,<29,28>,<30,28>,<31,30>,<32,0>...
所以得出结论为:
当x为奇数的时候,x=x&(x-1)它的值相当于x = x-1;一样的效果~~~
当x为2的N次幂时,结果为0;
其他希望下面人能找出一点规律出来~~~
BluefireUOOP 2005-10-05
  • 打赏
  • 举报
回复
当然,从位上考虑就是nasi00(莫傲·逍遥)的意思了,顶
BluefireUOOP 2005-10-05
  • 打赏
  • 举报
回复
如果X不是4的整数倍,那么原式可以表示:
{
不超过X的最大偶数.
}
否则
{
如果X是2的N(N属于Z)次幂,那么原式可以表示:
0
如果X是4的整数倍,那么原式可以表示:
{...复杂的表达式(偶还没发现规律~~笨555)...}
}
nasi00 2005-10-05
  • 打赏
  • 举报
回复
<Hacker's Delight>这本书第1章就有介绍,这种算法是把一个二进制数最右边的一个1变成0。

一个简单的程序,先给出运算结果:

1011001
1011000
1010000
1000000

这是代码:

#include <stdio.h>


void OutBin(int n)
{
int a[32], l = 0;

if(n == 0) {
printf("0");
return;
}

while(n > 0) {
a[l++] = n % 2;
n >>= 1;
}

while(l--)
printf("%d", a[l]);
}

int main()
{
int x = 89;

OutBin(x);
printf("\n");

x &= x-1;

OutBin(x);
printf("\n");

x &= x-1;

OutBin(x);
printf("\n");

x &= x-1;

OutBin(x);
printf("\n");

return 0;
}
snowbirdfly 2005-10-05
  • 打赏
  • 举报
回复
我觉得楼主应该知道&这个是位运算中的位与运算,
楼主只是想知道x=x&(x-1)到底有什么功能~~
  • 打赏
  • 举报
回复
位运算。
&是位与。
snowbirdfly 2005-10-05
  • 打赏
  • 举报
回复
只看出来当x为奇数的时候,x=x&(x-1)它的值相当于x = x-1;一样的效果~~~

33,323

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧