位运算
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; }
这篇关于位运算的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南