题面:
题目描述
题目描述:
定义一个函数 f=lowbit(x),这个函数的值是 x 的二进制表达式中最低位的 1 所对应的值。
例如lowbit(6) 就等于 2,因为 (110)2 中最低位(就是从右往左数的第二位)对应的数是2^1=2
所以假设一个数的二进制最低位的1在从右往左数的第k位,那么它的lowbit值就是2^(k−1)
请你设计一个函数,可以计算出x的lowbit值:
输入格式:
一个十进制整数x
输出格式:
一个十进制整数
输入样例
6
输出样例
2
补充:关于lowbit运算,最著名的应用应该算是树状数组。但是lowbit的神妙远远不止树状数组,在很多二进制和位运算的相关题目中,都有lowbit运算的影子。甚至,在状态压缩DP中,lowbit也扮演着一份不可忽视的角色。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x;
ll f(ll);
ll lowbit(ll, ll);
int main()
{
scanf("%lld", &x);
printf("%lld", f(x));
return 0;
}
ll f(ll x)
{
return lowbit(2, (x & (-x)) - 1);
}
ll lowbit(ll n, ll k)
{
if (k == 0)
{
return 1;
}
else if (k % 2 == 1)
{
return lowbit(n, k - 1) * n;
}
else
{
ll temp = lowbit(n, k / 2);
return temp * temp;
}
}
WA40分!