华为8.26第一题:位转换:没有任何技巧,纯c++代码
* 题目描述:题目中提示,每个数字的二进制为32bit)
* 1.输入n个无符号整数
* 2.给每个数字增加干扰措施。
* 2.1 干扰1:让每个整数的二进制位置上的数字交换,即(2*i)与(2*i+1)交换,i=0:15。以下讨论说的都是二进制数。
* 2.2 干扰2:假设三个数a,b,c,a(XXXXXXXXXXa2a1)的最后两位弹出a1,a2;a1,a2进入b的头,同时b的最后两位b1b2弹出,此时b变为(a2a1XXXXXXXXXXXX),c同理,变为(b2b1XXXXXXXXXXXX),将c的尾巴c1c2弹入a的头,a变为(c2c1XXXXXXXXXXXXX)。
* 最终效果:(干扰2:再把每个数向右移动两位,溢出的部分依次像下一个整数的最高位移动,末尾的右移两位到第一个数的最高两位)
* a(XXXXXXXXXXXXa2a1)->(c2c1XXXXXXXXXXXXX);
* b(XXXXXXXXXXXXb2b1)->(a2a1XXXXXXXXXXXX);
* c(XXXXXXXXXXXXc2c1)->(b2b1XXXXXXXXXXXX);
* 。。。。。。应该叙述清楚了。倘若只有一个数a,这个应该好分析
* 3.输出每个***扰后的数字(十进制的,同空格隔开)
主要思路:
按照题目要求来,本题的思路是用unsigned int转二进制,再转字符串做翻转进行相应操作 后续这种转换,我感觉要直接用移位来,这是c++的优势
小的tricks:我之前也遇到过字符串输入带空格。。。用getline(cin,s)。。。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200828204516944.png#pic_center)
#include
#include
#include
#include
#include
using namespace std;
// 将数转换为32位数的二进制
string zhuanhuan1(unsigned int a)
{
string temp;
int t = 0;
for (int i = 0; i
for (int i = 0; i
s.pop_back();
s.pop_back();
reverse(s.begin(), s.end());
s.push_back(l1);
s.push_back(l2);
reverse(s.begin(), s.end());
}
int main()
{
// 输入
unsigned int temp;
vector arr;
while (cin >> temp)
{
arr.push_back(temp);
}
vector str(arr.size());
// 转换为二进制并增加干扰1
for (int i = 0; i
for (int i = 1; i
arr[i] = zhuanhuan2(str[i]);
cout |