位运算

2022/4/11 23:42:30

本文主要是介绍位运算,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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;
}

 



这篇关于位运算的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程