位运算
作者:互联网
1.按位与(&):
运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。
即 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。
两个整数在按位与运算时每一位分别进行运算,如3&5=011&101=001=1;
按位或(|):
2.运算规则:参加运算的两个数只要两个数中的一个为1,结果就为1。
即 0 | 0= 0 , 1 | 0= 1 , 0 | 1= 1 , 1 | 1= 1 。
两个整数在按位与运算时每一位分别进行运算,如3|5=011|101=111=7;
3.异或(^):
运算规则:参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
即 0 ^ 0=0 , 0 ^ 1= 1 , 1 ^ 0= 1 , 1 ^ 1= 0 。
两个整数在按位与运算时每一位分别进行运算,如3^5=011^101=110=6;(异或可以理解成二进制相加但不进位的操作)
4.左移运算符(<<):
将二进制码整体左移指定位数,左移后空出来的位用‘0’填充。
如5<<2=101<<2=10100=20;
5.右移运算符(>>):
把操作数的二进制码右位移指定位数,左边空出来的位以原来的符号位填充。原来是负数就填充1,原来是正数就填充0。符号位不变。
复合运算
1、&= 例:a &=b 相当于a=a& b
2、|= 例:a |=b 相当于a=a |b
3、>>= 例:a >>=b 相当于a=a>> b
4、<<= 例:a<<=b 相当于a=a<< b
5、^= 例:a ^= b 相当 a=a ^b
贴一道题:
一般来说,一个正整数可以拆分成若干个正整数的和。例如,1=1,10=1+2+3+4 等。
对于正整数 n 的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下,n 被分解为了若干个不同的 2 的正整数次幂。注意,一个数 x 能被表示成 2 的正整数次幂,当且仅当 x 能通过正整数个 2 相乘在一起得到。
例如,10=8+2=23+21是一个优秀的拆分。但是,7=4+2+1=22+21+20 就不是一个优秀的拆分,因为 1 不是 2 的正整数次幂。现在,给定正整数 n,你需要判断这个数的所有拆分中,是否存在优秀的拆分。若存在,请你给出具体的拆分方案。
输入格式:
输入文件只有一行,一个正整数 n,代表需要判断的数。
输入样例:
在这里给出一组输入。例如:
6
输出样例:
在这里给出相应的输出。例如:
4 2
样例解释1
6 = 4 + 2 = 22+21是一个优秀的拆分。注意,6=2+2+2不是优秀的拆分,因为拆分成的 3 个数不满足每个数互不相同。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,t;
cin>>n;
if(n&1)//判断n是否为奇数。
{
cout<<-1;
return 0;
}
for(int i=32;i>=1;i--)
{
t=1ll<<i;//1ll是指将1转换为longlong类型,t的值为2的i次幂。
if(t&n)//说明n的二进制第i+1位是1.
{
cout<<t<<' ';
}
}
return 0;
}
标签:正整数,运算,填充,优秀,按位,拆分 来源: https://www.cnblogs.com/cbmango/p/16133015.html