我如何在C中反转以下算法
How do I reverse the following algorithm in C
本文关键字:算法 更新时间:2023-10-16
我有以下算法:
unsigned long specialNum=0x4E67C6A7;
unsigned int ch;
char inputVal[]=" AAPB2GXG";
for(int i=0;i<strlen(inputVal);i++)
{
ch=inputVal[i];
ch=ch+(specialNum*32);
ch=ch+(specialNum/4);
specialNum=bitXor(specialNum,ch);
}
int outputVal=specialNum;
bitXor只是进行Xor操作:
int bitXor(int a,int b)
{
return (a & ~b) | (~a & b);
}
现在我要反转算法。给定了输出值,我想要得到输入值。这就是我到目前为止所做的。但它不工作:(
while(outputVal!=0x4E67C6A7)
{
ch=bitXor(outputVal,0x4E67C6A7);
outputVal=outputVal-(ch*4);
outputVal=outputVal-(ch/32);
inputVal[i++]=(char)ch;
if(i>32)
break;
}
编辑:好吧,我同意这是不可能的。但我想知道为什么我的问题被否决了。我在发帖前遵循了指导方针,我不认为这个问题太糟糕了。
在请求的"反向"算法中,您要求将4字节数转换为任意长度的字符串。这显然是不可能的,因为假设您正在这样做,您已经发明了一个终极压缩算法。
你要求的"反向算法"是不可能的。您的示例inputVal
是一个长度超过30个字母的字符串。您的outputVal
最多是4或8字节。信息理论指出,如果n> k,则不可能将任意n字节字符串存储到k字节字符串中。
你的前向算法基本上是以一种尴尬的方式将数组inputVal
中的值打包到标量变量specialNum
中。
而且,在结尾处有一个从unsigned long specialNum
到int outputVal
的不安全转换。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何在 Mac 上使用 c++17 并行标准库算法?