社区
新手乐园
帖子详情
x=x&(x-1)
party9ly
2005-10-05 04:19:26
x=x&(x-1)句话啥意思啊?
...全文
2776
18
打赏
收藏
x=x&(x-1)
x=x&(x-1)句话啥意思啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
一叶还真不知秋
2005-10-06
打赏
举报
回复
将最低的非0位以下的位置0。
以16位计
如:0x???????1->0x???????0
0x???10000->0x???00000
一叶还真不知秋
2005-10-06
打赏
举报
回复
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)到底有什么功能~~
一叶还真不知秋
2005-10-05
打赏
举报
回复
位运算。
&是位与。
snowbirdfly
2005-10-05
打赏
举报
回复
只看出来当x为奇数的时候,x=x&(x-1)它的值相当于x = x-1;一样的效果~~~
QGIS 添加国内地图提供商(高德/百度/必应/腾讯)卫星及路网图
1、打开QGIS 2、在左侧 浏览->XYZ Tites 上点击右键选择 新建连接 3、在弹出窗口 网址 中根据需求输入以下条目,名称随意 高德卫星: https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&...
高德、百度、腾讯在线瓦片地址(weixin公众号【图说GIS】)
前言 互联网地图的发展异常迅速,从前几年主流的栅格瓦片到现在的...x={x}&y={reverseY}&type=vector&style=0&scene=0”, terrain = “http://p{s}.map.gtimg.com/demTiles/{z}/{sx}/{sy}/{x}{reverseY
《学习笔记56》—— python爬虫显示乱码 b‘\x1f\x8b\x08\x00\x00\x00\x00\x00\...‘
当我们使用python爬取网页时,运行以下代码: ...area=-1&is_finish=-1©right=-1&season_status=-1&season_month=-1&year=-1&style_id=-1&order=3&st=1&
有限域F_p上的椭圆曲线E:y^2=x^3+ax+b(mod p)的Mordell-Weil群的计算
D:\MathTool\gaptool>...(0,0),ord=1=>0->(0,0),ord=1 1->(0,1),ord=8=>2->(0,12),ord=8 2->(0,12),ord=8=>1->(0,1),ord=8 3->(1,2),ord=4=>4->(1,11),ord=4 4->(1,11),ord=4=&g
python中-=,+=,++等操作
这是一个减法赋值运算符,用于将右边...表示前缀自增(先加1,再返回新值),这两种写法在 C++ 是合法的。这样的后缀自增和前缀自增的写法是不合法的。是非法的,因为在 Python 中没有后缀自增运算符。: 在 Python 中,
新手乐园
33,325
社区成员
41,776
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章