我试图找到此函数的返回值:
char __slp_f1tb1t(char x) {
const static unsigned char _[2][2][2][2] = {
{ { { 0x00, 0x10 }, { 0x20, 0x30 } },
{ { 0x40, 0x50 }, { 0x60, 0x70 } } },
{ { { 0x80, 0x90 }, { 0xA0, 0xB0 } },
{ { 0xC0, 0xD0 }, { 0xE0, 0xF0 } } }
};
return _[!!(x&0x80)][!!(x&0x40)][!!(x&0x20)][!!(x&0x10)] | (x&15);
}
我该怎么办?我想我不明白char _ [2] [2] [2] [2]的含义是什么。
答案 0 :(得分:2)
来自standard
标识符是一系列非数字字符(包括 下划线_,小写和大写拉丁字母等 字符)和数字,指定一个或多个实体 在6.2.1中描述。小写和大写字母是不同的。 标识符的最大长度没有特定限制。
所以是的,它是一个有效的标识符名称。它是4d阵列。
那么在这里做了什么 - 让我们一步一步走。如果_
是数组,则[]
内的那些是它的索引。
那么!
是什么?来自standard
逻辑否定运算符
!
的结果是0
,如果其操作数的值不等于0
,1
,如果其操作数的值比较等于0
。结果的类型为int
。表达式!E
相当于(0==E)
。
因此它导致索引的值为0,1
。嗯,这个多维数组中的所有数组的大小都是2
。所以没关系 - 我们可以访问0
和1
的所有元素。
x
是一个字符 - sizeof char
是1
- 1个字节。
x [0 0 0 0 1 0 1 0]
现在你执行x&0x80
这只是And
0x80 - 1 0 0 0 0 0 0 0
的结果。
所以基本上检查各自的数字并用char
变量的值进行OR运算。
为什么char
变量的值不是x&15
?
15
(0x0F
)为0000 1111
,使用x
的任何值对其进行处理将导致最后4位(LSB)x
。