解码整数值

时间:2017-11-24 08:45:18

标签: c++ bit-manipulation

我有这个编码整数值的程序:

#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.

1 个答案:

答案 0 :(得分:1)

不,不是。

|=在某种意义上是不可逆的,如果你写c = a | b,然后给cab,你可以&# 39;恢复另一个变量。

按位运算符<<>>显然是有损的,因为它们引入了0位。

你在XOR方面会有更好的运气:如果你写c = a ^ b,那么c ^ b将是a