自从我用C / C ++编程以来已经有一段时间了。对于我的生活,我不记得(或在谷歌找到)如何使这项工作。我认为有一种写简单字符串的简写方法,如下所示:
0x00 => 0x00000000
0xFF => 0xFFFFFFFF
0xCD => 0xCDCDCDCD
例如,如果我宣布
int x = 0xCD;
printf("%d", x) // prints "3452816845", not "205".
不使用位移(即预处理器处理它)。我疯了吗? PS我正在使用Microsoft Visual C ++ 2010
答案 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
当然,每次要创建具有不同重复次数的“生成器”时,都必须创建一个新的宏。