C ++将整数向量转换为整数
c++ convert vector of integers to an integer
正在网上搜索简单指南,但找不到。
我构建了一个从十进制到二进制的转换器,并将 1 和 0 保存在一个向量中。我现在想将该向量变成一个整数。
我找到了各种方法(我不太了解)转换为字符串而不是整数,可以避免吗?
我希望它尽可能简单。
这是我的代码:
c.hpp:
#ifndef C_HPP
#define C_HPP
#include <vector>
class Dualrechnung{
private:
std::vector<int> vec;
int z = 123456; //Eingegebene Zahl
int t_z = z; //temp Zahl
public:
Dualrechnung();
~Dualrechnung();
};
#endif
c.cpp:
#include <vector>
#include <cmath>
#include <sstream>
#include "c.hpp"
#include <iostream>
Dualrechnung::Dualrechnung()
{
int b;
for (int i=0; (t_z-(pow(2,i))) >= 0; i++) //finds biggest power of 2 in z
{
b= i;
}
t_z-=pow(2,b); //whats left after the biggest power
vec.push_back(1);
for(int i = b; i > 0; --i) //checks for every power of 2 multiples smaller than b if they exist in z. if they are, saves 1 for that power in the vector and if not, saves 0.
{
b--;
if((t_z-pow(2,b)) >= 0)
{
vec.push_back(1);
t_z-=pow(2,b);
}
else{vec.push_back(0);}
}
// here I'd like that integer with the information from the vector
int bin; //binary value of z
std::cout << z << " in Dual ist " << bin;
}
Dualrechnung::~Dualrechnung(){}
c_test.cpp:
#include "c.cpp"
#include <iostream>
int main(){
Dualrechnung *d = new Dualrechnung();
delete d;
return 0;
}
我这样写给你的:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> myNumInVect = {1, 1, 0, 0, 1};
int myNumInInteger = 0;
int baseOfMyNumInVector = 2;
for (int i : myNumInVect) {
myNumInInteger = myNumInInteger * baseOfMyNumInVector + i;
}
cout << myNumInInteger;
return 0;
}
(此代码的输出为预期的 25 (11001(2)=25(10))
它使用Horner's method,所以操作次数'*' = vector.size()。它很容易适应其他基础位置数字系统向量(通过更改 baseOfMyNumInVector)。
------------@edit------------
我知道你有它,但我也想告诉你在没有任何 pow 的情况下转换 dec2givenBase 是多么容易,或者像这样:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int myNumInInteger = 111;
int baseOfMyNumInVector = 2;
vector<int> myNumInVect;
while (myNumInInteger > 0) { // using Horner Scheme for switching base
myNumInVect.push_back(myNumInInteger % baseOfMyNumInVector);
myNumInInteger /= baseOfMyNumInVector;
}
std::reverse(myNumInVect.begin(), myNumInVect.end()); // reverse (bcs there is no push_front() method in vector)
if (myNumInVect.empty()) { // handling the 0 case
myNumInVect.push_back(0);
}
for (auto digit : myNumInVect) { // write the result
cout << digit;
}
return 0;
}
如果我理解正确,您需要将 int
转换为位集,反之亦然。只需使用 std::bitset
具有来自 unsigned long
的构造函数和方法将其转换回来(您也可以将其转换为 to/from 0 和 1 的字符串)。
正在网上搜索简单指南,但找不到。
我构建了一个从十进制到二进制的转换器,并将 1 和 0 保存在一个向量中。我现在想将该向量变成一个整数。 我找到了各种方法(我不太了解)转换为字符串而不是整数,可以避免吗? 我希望它尽可能简单。
这是我的代码:
c.hpp:
#ifndef C_HPP
#define C_HPP
#include <vector>
class Dualrechnung{
private:
std::vector<int> vec;
int z = 123456; //Eingegebene Zahl
int t_z = z; //temp Zahl
public:
Dualrechnung();
~Dualrechnung();
};
#endif
c.cpp:
#include <vector>
#include <cmath>
#include <sstream>
#include "c.hpp"
#include <iostream>
Dualrechnung::Dualrechnung()
{
int b;
for (int i=0; (t_z-(pow(2,i))) >= 0; i++) //finds biggest power of 2 in z
{
b= i;
}
t_z-=pow(2,b); //whats left after the biggest power
vec.push_back(1);
for(int i = b; i > 0; --i) //checks for every power of 2 multiples smaller than b if they exist in z. if they are, saves 1 for that power in the vector and if not, saves 0.
{
b--;
if((t_z-pow(2,b)) >= 0)
{
vec.push_back(1);
t_z-=pow(2,b);
}
else{vec.push_back(0);}
}
// here I'd like that integer with the information from the vector
int bin; //binary value of z
std::cout << z << " in Dual ist " << bin;
}
Dualrechnung::~Dualrechnung(){}
c_test.cpp:
#include "c.cpp"
#include <iostream>
int main(){
Dualrechnung *d = new Dualrechnung();
delete d;
return 0;
}
我这样写给你的:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> myNumInVect = {1, 1, 0, 0, 1};
int myNumInInteger = 0;
int baseOfMyNumInVector = 2;
for (int i : myNumInVect) {
myNumInInteger = myNumInInteger * baseOfMyNumInVector + i;
}
cout << myNumInInteger;
return 0;
}
(此代码的输出为预期的 25 (11001(2)=25(10))
它使用Horner's method,所以操作次数'*' = vector.size()。它很容易适应其他基础位置数字系统向量(通过更改 baseOfMyNumInVector)。
------------@edit------------
我知道你有它,但我也想告诉你在没有任何 pow 的情况下转换 dec2givenBase 是多么容易,或者像这样:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int myNumInInteger = 111;
int baseOfMyNumInVector = 2;
vector<int> myNumInVect;
while (myNumInInteger > 0) { // using Horner Scheme for switching base
myNumInVect.push_back(myNumInInteger % baseOfMyNumInVector);
myNumInInteger /= baseOfMyNumInVector;
}
std::reverse(myNumInVect.begin(), myNumInVect.end()); // reverse (bcs there is no push_front() method in vector)
if (myNumInVect.empty()) { // handling the 0 case
myNumInVect.push_back(0);
}
for (auto digit : myNumInVect) { // write the result
cout << digit;
}
return 0;
}
如果我理解正确,您需要将 int
转换为位集,反之亦然。只需使用 std::bitset
具有来自 unsigned long
的构造函数和方法将其转换回来(您也可以将其转换为 to/from 0 和 1 的字符串)。