- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用这个函数我们可以轻松地将 vector 转换为十进制(整数):
vector<bool> A = {0, 1, 1, 1,0,1}; # A size will change during run time
long int integer = 0, n = 0;
for (auto i : A)
{
if (i)
{
integer += pow(2, n);
}
n = n + 1;
}
但如果 vector 的元素超过 64 个,结果将不可预测。
我们如何编写类似的函数,但返回的是字符串呢?
最佳答案
正如其他人所建议的那样,使用 std::bitset
是表示任何固定长度的二进制数的更好选择(对于动态长度,如您的情况,请参阅 boost::dynamic_bitset
)。 This link解释了为什么不使用 std::vector<bool>
的一些原因.
您的问题几乎可以概括为实现 BigNum 类。就像您在方法中所做的那样,您首先需要将您的值从二进制转换为十进制(但现在需要 64 位以上的精度)。一旦构建了 BigNum,将其转换为字符串就很简单了。我通过简单地修改 BigNum
实现了您请求的算法我前段时间制作的类(class)。
要打印二进制数,以下几行就足够了。
/*Creates a 90-digit binary number with all bits set.*/
std::vector<bool> A(90, 1);
/*Prints its decimal reprsentation*/
cout << longBinaryToDecimalAsString(A);
至于实现:
#ifndef BIG_NUM_H
#define BIG_NUM_H
#include <string>
#include <vector>
#include <sstream>
#include <cstdint>
class BigNum {
public:
BigNum(){values.push_back(0);}
BigNum(std::uint64_t val){
if (val == 0)
values.assign(1, 0);
else{
while (val > 0){
values.push_back(val % 10);
val /= 10;
}
}
}
BigNum &operator+=(BigNum &rhs)
{
std::vector<std::uint8_t> *lowAddend, *bigAddend;
/*If right value is larger, ‘values’ vector will always grow*/
if (rhs.values.size() > values.size()){
values.resize(rhs.values.size(), 0);
lowAddend = &values;
bigAddend = &rhs.values;
}
else{
values.push_back(0);
bigAddend = &values;
lowAddend = &rhs.values;
}
std::uint8_t carry = 0;
size_t i = 0;
/*First we sum lower part*/
for (; i < lowAddend->size(); ++i){
std::uint8_t sum = values[i] + rhs.values[i] + carry;
values[i] = sum % 10;
carry = sum / 10;
}
/*Now we copy the remaining part*/
for (; i < bigAddend->size(); ++i){
/*For 10 10, sum will be 18, at most*/
std::uint8_t sum = (*bigAddend)[i] + carry;
values[i] = sum % 10;
carry = sum / 10;
}
this->trimFrontalZeros();
return *this;
}
BigNum &operator*=(BigNum &rhs)
{
/*Case when one of the operands is Zero*/
if (this->isZero())
return *this;
else if (rhs.isZero()){
values.assign(1, 0);
return *this;
}
size_t maxLen = values.size() + rhs.values.size();
std::vector<std::uint8_t> product(maxLen);
size_t lowSize, bigSize;
std::vector<std::uint8_t> *multiplier, *multiplicand;
/*The iteration process for the multiplicaiton is developed as the multiplier (A in A*B)
as the one with more digits.*/
if (values.size() > rhs.values.size()){
multiplier = &values;
multiplicand = &rhs.values;
bigSize = values.size();
lowSize = rhs.values.size();
}
else{
multiplier = &rhs.values;
multiplicand = &values;
bigSize = rhs.values.size();
lowSize = values.size();
}
/*Implemented as 'values x rhs.values' */
std::uint8_t carry = 0;
for (size_t n = 0; n < maxLen; ++n){
size_t numIters;
if (maxLen - n - 1< lowSize) numIters = maxLen - n - 1;
else numIters = std::min(n + 1, lowSize);
std::uint64_t sum = 0;
for (size_t i = 0; i < numIters; ++i){
size_t indBelow = i + n + 1 - std::min(n + 1, lowSize);
size_t indAbove = std::min(n + 1, lowSize) - 1 - i;
std::uint8_t be = (*multiplier)[indBelow];
std::uint8_t ab = (*multiplicand)[indAbove];
sum += be*ab;
}
sum += carry;
product[n] = sum % 10;
carry = sum / 10;
}
values.assign(product.begin(), product.end());
this->trimFrontalZeros();
return *this;
}
std::string toString(){
std::stringstream ss;
std::copy(values.rbegin(), values.rend(), std::ostream_iterator<int>(ss, ""));
return ss.str();
}
private:
bool isAbsOne() {return values.size() == 1 && values[0] == 1;}
bool isZero() {return values.size() == 1 && values[0] == 0;}
void trimFrontalZeros(){
size_t newSize = values.size();
auto it = values.rbegin();
while (it != values.rend() && *it == 0){
++it;
--newSize;
}
values.resize(newSize);
}
std::vector<std::uint8_t> values;
};
std::string longBinaryToDecimalAsString(std::vector<bool> &longBinary){
BigNum big;
std::uint64_t n = 0;
for (bool bit : longBinary){
if (bit){
if (n > 63){
BigNum aux(1);
for (std::uint64_t i = 0; i < n / 32; ++i){
aux *= BigNum(1ULL << 32);
}
aux *= BigNum(1ULL << (n % 32));
big += aux;
}
else{
big += BigNum(1ULL << n);
}
}
++n;
}
return big.toString();
}
#endif
请注意这是一个非常简化的版本 BigNum
类(class)。将它用于此问题之一以外的目的可能会产生不良结果。例如,它没有考虑 +
的负数。和 *
操作。
关于c++ - 将 vector<bool> 转换为十进制(作为字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25460192/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!