x>>k
x>>1等价于x/2
设x=10,k=1;x的二进制形式为(1010),x>>k为x右移一位即(101),若k为2则x>>k为x右移两位即(10)。
代码:
# include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while(n)
{
cout << (n >> 1) << endl;
n = (n >> 1);
}
return 0;
}
实现效果:
第一次x>>k得二进制(101)即十进制5;
第二次x>>k得二进制(10)即十进制2;
第三次x>>k得二进制(1)即十进制1;
最后得0,循环结束。
x<<k
x<<1等价于x*2
设x=10,k=1;x的二进制形式为(1010),x<<k为x左移一位即(10100),若k为2则x>>k为x右移两位即(101000)。
代码:
# include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while(n<50)
{
cout << (n <<1) << endl;
n = (n << 1);
}
return 0;
}
实现效果:
第一次x<<k得二进制(10100)即十进制20;
第二次x<<k得二进制(101000)即十进制40;
第三次x<<k得二进制(1010000)即十进制80;
最后得n>50,循环结束。
x&1
x&1表示二进制x最低位的数值。
例如:
10的二进制为(1010)则10&1得 0
15的二进制为(1111)则15&1得 1
8的二进制为(1000)则8&1得 0
代码:
# include <iostream>
using namespace std;
int main()
{
int n;
cout << (10 & 1)<<endl;
cout << (15 & 1)<<endl;
cout << (8 & 1)<<endl;
return 0;
}
实现效果:
综合应用:
# include <iostream>
using namespace std;
int main()
{
int n = 10;
for(int i=3;i>=0;i--)
{
cout << (n >> i & 1);
}
return 0;
}
实现效果:
lowbit()函数
lowbit(n)是n的二进制表达式中最低位的1所对应的值。
实现原理:
在二进制时,一个整数的负数,为这个整数取反加1。
以101010000为例,取反为010101111,加一后为010110000,取反加一后与原数相与得000010000,得到的即为最低位的1所对应的值。
代码:
# include <iostream>
using namespace std;
int lowbit(int x)
{
return x&(-x);//等于return x&(~x+1)
}
int main()
{
int n;
cin >> n;
cout<<lowbit(n);
return 0;
}
效果展示: