我有这个任务,我需要在二进制数组中获得5个数字,但我不能想到生成它的方法。建设过程是:
开始宽度10然后添加相同的数字,但是1和0是这样的切换位置
10
10 + 01
1001 + 0110
10010110 + 01101001
1001011001101001 + 0110100110010110
...
如果我只有n <= 2 * 10 ^ 9
,我无法找到找到n,n + 1,n + 2,n + 3和n + 4的方法记住这是学校的任务来自老奥林匹克女巫的任务我正在做的是理解任务概念和学习下一个任务
符号数组1001011001101001 ...这样做 - 首先写入1然后最后一部分数组写入现有的一个只改变1到0和0到1像这样1→10→1001→10010110→...
任务:编写程序,如果n&lt; = 2 * 10 ^ 9,则该数组中的任何给定整数n都会找到n,n + 1,n + 2,n + 3和n + 4符号。
答案 0 :(得分:1)
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <bitset>
#include <array>
#include <string>
#include <vector>
void finddigit(int n)
{
const int a[]={1,4,6,7,10,11,13,16};
int b[]={2,3,5,8,9,12,14,15};
std::vector<int> t ;
std::vector<int>::iterator found;
int floored=(int)(floor((double)n/8));
int residue=n-8*floored;
if(residue==0)
residue=n-(--floored)*8;
std::string bin = std::bitset<8>(floored).to_string();
if (std::count(bin.begin(), bin.end(), '1')%2==0)
t.assign(a,a+8);
else t.assign(b,b+8);
found=std::find(std::begin(t), std::end(t), residue);
if (found != t.end())
std::cout << "1";
else
std::cout << "0";
}
void main(int argc, char **argv)
{
for (int i=1;i<65;i++)
finddigit(i);
}
1001011001101001011010011001011001101001100101101001011001101001
答案 1 :(得分:0)
(2 << 2) & (~2) // 1000 + 01 = 1001 = 9
(9 << 4) & (~9) // 10010000 + 0110 = 10010110
// an so on ..
我们可以注意到,这里的背叛是永远加倍的。 2,4,8,
~
表示否定
&
表示和
<<
表示向左偏移
所以,我们需要的就是用数组进行位操作
你可以在两个数组之间找到一个make位操作函数
void and(void *result, const void *first, const void *second, size_t lengthInBytes) {
char *_result = (char*)result;
char *_second = (char*)second;
char *_first = (char*)first;
for (size_t i = 0; i < lengthInBytes; i++) {
_result[i] = _first[i] & _second[i]; // here can be any bit operation
}
}