C / C ++中的简写字节表示法?

时间:2011-11-01 18:29:42

标签: c++ c

自从我用C / C ++编程以来已经有一段时间了。对于我的生活,我不记得(或在谷歌找到)如何使这项工作。我认为有一种写简单字符串的简写方法,如下所示:

0x00 => 0x00000000
0xFF => 0xFFFFFFFF
0xCD => 0xCDCDCDCD

例如,如果我宣布

int x = 0xCD;
printf("%d", x) // prints "3452816845", not "205".

不使用位移(即预处理器处理它)。我疯了吗? PS我正在使用Microsoft Visual C ++ 2010

7 个答案:

答案 0 :(得分:13)

最简单的方法是:

0x1010101u * x

我想不出任何可能更简单或更不言自明的语法......

编辑:我认为您希望它适用于任意类型。因为它只对无符号类型有意义,所以我假设你使用的是无符号类型。然后尝试

#define REPB(t, x) ((t)-1/255 * (x))

答案 1 :(得分:8)

默认情况下在C中没有类似的东西。在CSS中有类似的东西(颜色#123扩展为#112233),但这完全不同。 :)

你可以编写一个宏来为你做这件事,比如:

#define REPEAT_BYTE(x) ((x) | ((x) << 8) | ((x) << 16) | ((x) << 24))
...
int x = REPEAT_BYTE(0xcd);

答案 2 :(得分:2)

除非您编写自己的宏,否则这是不可能的。怎么知道重复多久? 0xAB可能意味着0xABABABABABABABABABABAB所知道的一切(使用提出的想法)。

答案 3 :(得分:2)

没有这样的速记。 0x00与0相同.0xFF与0x000000FF相同。

答案 4 :(得分:2)

不。但是你可以使用memset:

int x;
memset(&x, 0xCD, sizeof(x));

你可以制作一个宏:

#define INITVAR(var, value) memset(&(var), (int)(value), sizeof(var))
int x;
INITVAR(x, 0xCD);

答案 5 :(得分:1)

你可以使用一些模板技巧:

#include <iostream>
#include <climits>

using namespace std;

template<typename T, unsigned char Pattern, unsigned int N=sizeof(T)>
struct FillInt
{
    static const T Value=((T)Pattern)<<((N-1)*CHAR_BIT) | FillInt<T, Pattern, N-1>::Value;
};

template<typename T, unsigned char Pattern>
struct FillInt<T, Pattern, 0>
{
    static const T Value=0;
};

int main()
{
    cout<<hex<<FillInt<unsigned int, 0xdc>::Value<<endl; // outputs dcdcdcdc on 32 bit machines
}

自动适应作为第一个参数传递的整数类型,并在编译时完全解析,但这只是为了好玩,我不认为我会在实际代码中使用这样的东西。

答案 6 :(得分:1)

您可以使用预处理程序标记连接:

#include <stdio.h>
#define multi4(a) (0x##a##a##a##a)

int main()
{
    int a = multi4(cd);
    printf("0x%x\n", a);
    return 0;
}

结果:

0xcdcdcdcd

当然,每次要创建具有不同重复次数的“生成器”时,都必须创建一个新的宏。