在二进制数组中查找5个数字

时间:2015-12-18 07:34:44

标签: c++ arrays binary

Math side

我有这个任务,我需要在二进制数组中获得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符号。

2 个答案:

答案 0 :(得分:1)

explanation is here

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