Closed. This question needs details or clarity. It is not currently accepting answers. Learn more
想改进这个问题吗添加细节并通过editing this post澄清问题。
四年前关闭。
我在读一本关于集会的书,这里有一句我不太明白的话。它说,访问最低有效位的最有效方法是使用以下代码:
*(unsigned char*)&a

有人能告诉我为什么这么快吗?
有人告诉我,我需要很好地理解组装才能得到这个。

最佳答案

我会尽力解释的。
当变量存储在内存中时,它有几个重要的属性:
地址
大小
类型
从你的问题来看,我怀疑你问的是大于1的整数变量。例如,int类型由C标准定义为fastat least 16 bit。所以是2到4个字节。
所以,takeint的大小是4。
然后我们知道,这个变量占用了4个字节和一些起始地址(&a):addr+0、addr+1、addr+2、addr+3。
在讨论C约定时,可以将指针从一种类型转换为另一种类型,并将其用于访问数据(假设您知道自己在做什么)。在我们的例子中,我们知道char只有1字节长。因此,我们可以使用直接内存访问从单个char中提取4ints:

char ch0 = *((char *)&a + 0); // OR ((char*)&a)[0]
char ch1 = *((char *)&a + 1); // OR ((char*)&a)[1]
char ch2 = *((char *)&a + 2); // OR ((char*)&a)[2]
char ch3 = *((char *)&a + 3); // OR ((char*)&a)[3]

现在我们有4个字节,问题是:哪个字节包含哪些值。也就是说,当我们的a等于0x12345678时,我们可能有多种不同的方法,不同的部分如何在内存中排序。
在x86(与您的案例非常接近)上,顺序是这样的,因此我们的int(0x78)的最低部分首先存储,然后是第二部分,依此类推:
a              : 0x12345678
((char*)&a)[0] : 0x78
((char*)&a)[1] : 0x56
((char*)&a)[2] : 0x34
((char*)&a)[3] : 0x12

因此,要访问最低有效位,我们需要从最低有效位访问最低有效位。而且,获胜者是*(char*)&a。但比特值是:
*(char*)&a & 1

现在,关于为什么这不是真的。即使在x86上。与我们所说的真正的8位处理器不同,许多处理器的设计是经过优化的,以便在匹配寄存器大小时以最快的方式访问对齐的数据。所以,如果处理器有32位寄存器,它可能比1快4个字节,因为读取一个寄存器实际上意味着2个操作:读取4、截断和扩展符号。

关于c - 访问整数的最低有效位的最快方法? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28487239/

10-11 22:33
查看更多