我有这个编码整数值的程序:
#include "stdafx.h"
#define _SECURE_SCL_DEPRECATE 0
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
using namespace std;
template<class T>
vector<unsigned char> nToB(T );
unsigned long ByteToint(vector<unsigned char> v)
{
unsigned long int a = 0;
int s = v.size();
for (int i = 0; i<s ; i++)
{
a |= (v[s - 1 - i] << (8 * (s - i - 1)));
}
return a;
}
static unsigned long int Encode7Bits(unsigned long int);
int main()
{
cout << Encode7Bits(420);
getchar();
return 0;
}
static unsigned long int Encode7Bits( unsigned long int x)
{
vector<unsigned char> Result;
do
{
unsigned long int tmp = x & 0x7f;
x = x >> 7;
if (x > 0)
tmp |= 0x80;
Result.push_back((unsigned char )tmp);
} while (x > 0);
return ByteToint(Result);
}
如果此函数的参数为420,则返回932。
我的问题是是否可以进行反向操作,给出932的解码函数,返回420.
答案 0 :(得分:1)
不,不是。
|=
在某种意义上是不可逆的,如果你写c = a | b
,然后给c
,a
或b
,你可以&# 39;恢复另一个变量。
按位运算符<<
和>>
显然是有损的,因为它们引入了0位。
你在XOR方面会有更好的运气:如果你写c = a ^ b
,那么c ^ b
将是a
。