如果我有一个包含表示二进制数的N个元素的列表,并且每个节点(我将其命名为info)是布尔值(true = 1,false = 0),那么使用a获取小数值的最佳方法是什么递归函数是?
我尝试使用谷歌,但我只附带十进制公式;
1 * 2N + 0 * 2N-1 + 0 * 2N-2 + ... + 1 * 21 + 1 * 20
现在根据我对问题的理解,我有一个标题和方法的一些基本结构。问题还说第一个数字是最有意义的,但如果那是相关的话,我不太明白。
int Lista:: ConvierteBinarioDecimal ( void ) const;
static int suma= 0;
ConvierteBinarioDecimal();
}
return suma;
}
和Nodo(节点)类。
class Nodo{
public:
bool Nodo::getInfo(void); //Retorns the content of info
Nodo* Nodo::getNext(void); //Retorns the cotent of next
private:
bool info;
Nodo *next;
};
class Lista{
Nodo *primero;
int longitud;
};
我上周开始学习C ++,到目前为止它比Java更加艰难> _<所以任何帮助都是天赐之物。
答案 0 :(得分:1)
ConvierteBinarioDecimal()
{
int indice = longitud;
Nodo *corriente = primero; // current, begin at first node
while (corriente != null)
{
if (corriente->getInfo())
suma += 1 << --indice; // use bitshifting to add this binary digit
// alternatively, this could be "suma |= 1 << --indice;"
corriente = corriente->getNext(); // go to next node
}
}
我希望西班牙语也有帮助! :)
答案 1 :(得分:1)
这是一个递归的例子:
我必须做一些小改动,将 const 添加到 getInfo (这里没有问题)并将 const 添加到 getNext (你可能也需要和非const版本),问题是函数ConvierteBinarioDecimal
被声明为const
这是好的(不必为了计算而改变任何东西)十进制表示,但这个力,两个方法需要const
)你可以根据需要添加非const版本。
static int ConvierteBinarioDecimal(Nodo const* node) {
是从二进制转换为十进制的递归实现。如果需要递归,这是您的示例代码,如果您可以使用迭代版本,那么性能会更好。
#include <algorithm>
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Nodo {
public:
bool getInfo(void) const { return info; } // Retorns the content of info
Nodo* getNext(void) const { return next; } // Retorns the cotent of next
Nodo(bool i, Nodo* n) : info(i), next(n) {}
private:
bool info;
Nodo* next;
};
class Lista {
Nodo* primero;
int longitud;
public:
int ConvierteBinarioDecimal(void) const;
Lista(Nodo* p, int l) : primero(p), longitud(l) {}
};
static int ConvierteBinarioDecimal(Nodo const* node, int decimal = 0) {
if (node == NULL) // prefer C++11 nullptr
return decimal;
decimal *= 2;
if (node->getInfo())
decimal++;
return ConvierteBinarioDecimal(node->getNext(), decimal);
}
int Lista::ConvierteBinarioDecimal(void) const {
return ::ConvierteBinarioDecimal(primero);
}
int main(int argc, char* argv[]) {
Lista list(new Nodo(true, new Nodo(false, new Nodo(true, new Nodo(true, NULL)))), 4);
std::cout << list.ConvierteBinarioDecimal() << std::endl;
return 0;
}
答案 2 :(得分:-1)
执行此操作的最快方法之一是使用位移操作。所以,例如:
long decimal = 0;
Nodo * current = primero;
unsigned int bitcounter = 0;
while(current)
{
if(current->getInfo)
{
long temp = 1;
temp << bit counter;
decimal |= temp;
}
bitcounter++;
current = current->next;
}
基本上,我在这里所做的就是一睹目光。请注意我如何遍历链表。通过在以下迭代中检查current->next
,我在current
为空时停止。我还跟踪我正在处理的位。对于每个位,如果该位为1
,我将其放入临时变量并使用<<
运算符将其移至正确位置。然后我使用OR
运算符(OR和赋值)|=
这个临时变量和运行总计。
现在,以递归方式执行此操作:
long ConvertBinaryToDecimal()
{
static long decimal = 0;
static Nodo * current = primero;
// Base case
if(!current)
{
current = primero;
long result = decimal;
decimal = 0;
return result;
}
else {
decimal = decimal<<1;
if(primero->getInfo())
decimal |= 1;
current = current->next;
ConvertBinaryToDecimal();
}