优化转换算法
Optimizing conversion algorithm
我最近一直在做一本我一直在读的书中的练习。任务是编写一个程序,打印出1-256之间的所有数字,分别是二进制、八进制和十六进制。我们只应该使用到目前为止在书中所学到的方法,这意味着只使用for, while和do. while循环,if和else if语句,将整数转换为等效的ASCII和一些更基本的东西(例如cmath和iomanip)。
所以经过一些工作,这是我的结果。然而,它是混乱的、不优雅的和模糊的。有没有人有任何提高代码效率(或优雅)的建议?P)和性能?
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
int decimalValue, binaryValue, octalValue, hexadecimalValue, numberOfDigits;
cout << "DecimalttBinaryttOctalttHexadecimalnn";
for (int i = 1; i <= 256; i++)
{
binaryValue = 0;
octalValue = 0;
hexadecimalValue = 0;
if (i != 0)
{
int x, j, e, c, r = i, tempBinary, powOfTwo, tempOctal, tempDecimal;
for (j = 0; j <=8; j++) //Starts to convert to binary equivalent
{
x = pow(2.0, j);
if (x == i)
{
powOfTwo = 1;
binaryValue = pow(10.0, j);
break;
}
else if (x > i)
{
powOfTwo = 0;
x /= 2;
break;
}
}
if (powOfTwo == 0)
{
for (int k = j-1; k >= 0; k--)
{
if ((r-x)>=0)
{
r -= x;
tempBinary = pow(10.0, k);
x /= 2;
}
else if ((r-x)<0)
{
tempBinary = 0;
x /= 2;
}
binaryValue += tempBinary;
}
} //Finished converting
int counter = ceil(log10(binaryValue+1)); //Starts on octal equivalent
int iter;
if (counter%3 == 0)
{
iter = counter/3;
}
else if (counter%3 != 0)
{
iter = (counter/3)+1;
}
c = binaryValue;
for (int h = 0; h < iter; h++)
{
tempOctal = c%1000;
int count = ceil(log10(tempOctal+1));
tempDecimal = 0;
for (int counterr = 0; counterr < count; counterr++)
{
if (tempOctal%10 != 0)
{
e = pow(2.0, counterr);
tempDecimal += e;
}
tempOctal /= 10;
}
octalValue += (tempDecimal * pow(10.0, h));
c /= 1000;
}//Finished Octal conversion
cout << i << "tt" << binaryValue << setw(21-counter) << octalValue << "tt";
int c1, tempHex, tempDecimal1, e1, powOf;
char letter;
if (counter%4 == 0)//Hexadecimal equivalent
{
iter = counter/4;
}
else if (counter%4 != 0)
{
iter = (counter/4)+1;
}
c1 = binaryValue;
for (int h = 0, g = iter-1; h < iter; h++, g--)
{
powOf = g*4;
if (h == 0)
{
tempHex = c1 / pow(10.0, powOf);
}
else if (h > 0)
{
tempHex = c1 / pow(10.0, powOf);
tempHex %= 10000;
}
int count = ceil(log10(tempHex+1));
tempDecimal1 = 0;
for (int counterr = 0; counterr < count; counterr++)
{
if (tempHex%10 != 0)
{
e1 = pow(2.0, counterr);
tempDecimal1 += e1;
}
tempHex /= 10;
}
if (tempDecimal1 <= 9)
{
cout << tempDecimal1;
}
else if (tempDecimal1 > 9)
{
cout << char(tempDecimal1+55); //ASCII's numerical value for A is 65. Since 10-15 are supposed to be letters you just add 55
}
}
cout << endl;
}
}
system("pause");
return 0;
}
您已经介绍了' ioomanip ',这意味着您已经介绍了'iostream'。
如果是这种情况,请查看以下内容:
#include <iostream>
#include <iomanip>
using namespace std;
int x = 250;
cout << dec << x << " "
<< oct << x << " "
<< hex << x << "n"
<< x << "n"; // This will still be in HEX
列出每种输出类型的函数,然后循环遍历整数列表并依次输出每种不同格式的函数。
for (int i = 1; i <= 256; ++i)
{
printBin(i);
printHex(i);
printOct(i);
}
根本的问题是,这么长的函数需要重构以使其更加模块化。想象一下,您正在编写供其他人使用的代码。他们怎么能叫你的main
?他们如何理解每一段代码在做什么?他们不能。如果你把每一段有特定工作要做的代码作为一个函数来调用,那么就更容易理解它的意图,并在以后重用。
您是否考虑过编写一个适用于任何基的通用函数?
将非负数转换为通用基数很简单…你只需要计算number % base
并得到最低有效数字,然后将number
除以base
并重复得到其他数字…
std::string converted_number;
do {
int digit = number % base;
converted_number = digits[digit] + converted_number;
number = number / base;
} while (number != 0);
一旦你有一个通用的转换函数,那么解决你的问题很容易…只需使用base= 2,8和16调用它,即可获得所需的字符串结果。
我的回答可能有点开玩笑,但是
printf ("%u %o %x n", value, value, value);
将用于八进制和十六进制版本;)
对于二进制版本,我会使用一个初始化为256的标志,并用and运算符将其与您的数字进行比较。如果为true,则输出1,否则输出0。然后把旗子分成两半。重复,直到标志为1。
从整数到二进制转换的伪代码
int flag = 256
do
{
if (flag && value)
print "1"
else
print "0"
flag = flag >> 1 // aka divide by two, if my memory serves well
} while flag > 1
对于八进制和十六进制值,我有点生锈了,但环顾四周应该指导你的样本,你可以适应
为什么要把它弄得这么难呢?
for (int i = 1; i <= 256; ++i)
{
std::cout << std::dec << i << "t" << std::oct << i << "t" << std::hex << i << std::endl;
}
试试这个
using namespace std;
template <typename T>
inline void ShiftMask(T& mask) {
mask = (mask >> 1) & ~mask;
}
template < typename T >
std::ostream& bin(T& value, std::ostream &o)
{
T mask = 1 << (sizeof(T) * 8 - 1);
while (!(value & mask) && (mask != 0)) ShiftMask(mask);
while (mask) {
o << (value & mask ? '1' : '0');
ShiftMask(mask);
}
return o;
}
int main(void) {
for (int i=0; i<256;i++) {
bin(a, std::cout);
cout << " " << oct << i;
cout << " " << dec << i;
cout << " " << hex << i;
cout << ""
}
}
也许是这样的?
#include "stdio.h"
int main(){
char Chars[16]= {48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
for(int n = 1;n != 256; n++)
{
{//decimal
printf("%it", n);
}
{//Hexadecimal
char L, R;
R = (n & 0x0F) >> 0;
L = (n & 0xF0) >> 4;
printf("%c%ct", Chars[L], Chars[R]);
}
{//Octal
char L, M, R;
R = (n & 0x07) >> 0;
M = (n & 0x38) >> 3;
L = (n & 0xC0) >> 6;
printf("%c%c%ct", Chars[L], Chars[M], Chars[R]);
}
{//Binary
char B0, B1, B2, B3, B4, B5, B6, B7;
B0 = (n & 0x01) >> 0;
B1 = (n & 0x02) >> 1;
B2 = (n & 0x04) >> 2;
B3 = (n & 0x08) >> 3;
B4 = (n & 0x10) >> 4;
B5 = (n & 0x20) >> 5;
B6 = (n & 0x40) >> 6;
B7 = (n & 0x80) >> 7;
printf("%c%c%c%c%c%c%c%cn", Chars[B0], Chars[B1], Chars[B2], Chars[B3], Chars[B4], Chars[B5], Chars[B6], Chars[B7]);
}
printf("256t100t400t100000000n");
}
}
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- C/C++ 位数组分辨率转换算法
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 如何转换多次调用自己的递归算法?
- 将大十六进制数转换为十进制形式(以 10 为基数的形式)的算法
- 为什么我需要转换算法 remove() 的参数
- 将 24 位".bmp"图像转换为黑白/单色图像的可能算法是什么?
- 用于在C++中将串行日期 (Excel) 转换为年-月-日的算法
- 转换为动态规划算法
- 使用模块化算法将积分器转换为数组时出现问题
- (C语言)将RGB转换为HSV和HSV的算法在两者的范围为0-255范围内
- 重载标准::转换算法
- 如何为涉及对象成员、间接寻址和强制转换的排序算法实现lambda函数
- 克鲁斯卡尔算法用矢量转换
- 这是类型转换还是某种指针算法
- 将条件递归算法转换为迭代算法
- OpenCV的拜耳转换使用什么算法?
- 用C++算法将.csv文件转换为结构
- 如何从递归算法转换为迭代算法
- 路径笔画算法(转换为三角形/四边形)或其他建议