社区
新手乐园
帖子详情
x=x&(x-1)
party9ly
2005-10-05 04:19:26
x=x&(x-1)句话啥意思啊?
...全文
2760
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;一样的效果~~~
【c语言】有一个函数: x < 1 --- y = x 1 <= x < 10 --- y = 2 * x - 1 x >= 10 --- y = 3 * x - 11 输
// 有一个函数: // x = 10 --- y = 3 * x - 11 // 输入x,求y #include int main() { int x,y; printf("请输入x值:"); scanf("%d",&x); if(x < 1) y = x; else if(x >= 1 && x < 10) y = 2 * x - 1; else y = 3 *
python中axis=-1解释
在调用numpy库中的concatenate()时,有遇到axis=-1/1/0的情况。可以通过以下代码看出这三个值的差别: axis=0:在第一维操作 axis=1:在第二维操作 axis=-1:在最后一维操作 当操作对象为2维数组时,axis=1和axis=-1效果相同 import numpy as np #x为3*2*2维矩阵 x=np.array([[[1,2], [3,4]], [[5,6], [7,8]], [[9,10], [11,12]]]) #得
y=x++ + ++x(int x=0)的结果?
话不多说先附上代码 输出结果是多少呢?我第一次看到代码的时候 经过我认为毫无破绽的推理认为输出结果为 -1; 为了证实我得出的结果运行了一下 ,发现结果居然是2 。想了好长时间发现代码的核心就在第20行 我刚开始认为运行到这里是x=-1;那么x++ 是在运算后进行此时 相当于 y= -1 + ++x;++x是在运算前执行 那么结果为y=-1 + 0=-1;最后输出时x=0;y= -1;
python二分法算x-cosx 0_计算方法 习题二 答案
习题二1、利用二分法求方程f(x)=x3-2x-5=0,在2,3内根的近似值,并指出误差。解:f(2)=-1<0 f(3)=19>0 f(2).f(3)<0f’(x)=3x2-2 在x∈2,3f’(x) >0所以在1,2上必仅有一根x=2 f(2)=-1 -x=3 f(3)=16 +x=2.5 f(2.5)=5.625 +x=2.25 f(2.25)=1.890625 +x...
有如下函数: x (x<1) y= 2x-1 (1<=x<10) 3x-1 (x>=10)
#include<stdio.h> void main() { float x,y; printf(“please input the x:\n”); scanf("%f",&x); if(x<1) printf("%f",y=x); else if(x>=1&&x<10) printf("%f",y=2x-1); else if(x>=10) printf("%f",y=3x-1); }
新手乐园
33,323
社区成员
41,779
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章