zis*_*han -1 c c++ endianness computer-architecture
我正在阅读关于小端 - 大端的文章并且遇到了这些概念
long long number
(((number & 0x00000000000000ff) << 56) +
((number & 0x000000000000ff00) << 40) +
((number & 0x0000000000ff0000) << 24) +
((number & 0x00000000ff000000) << 8) +
((number & 0x000000ff00000000) >> 8) +
((number & 0x0000ff0000000000) >> 24) +
((number & 0x00ff000000000000) >> 40) +
((number & 0xff00000000000000) >> 56 ))
Run Code Online (Sandbox Code Playgroud)
基本上它做什么?
当我使用(gcc -lrt -lm program_name)编译它时.i得到一个警告说
integer constant is too large for ‘long’ type
Run Code Online (Sandbox Code Playgroud)
对于无符号的64位数据类型,该代码在little endian和big endian之间执行切换.
看看第一个子表达式:
(number & 0x00000000000000ff) << 56
Run Code Online (Sandbox Code Playgroud)
这将屏蔽0-7位,并将它们向左移动56.所以它们现在占据位56-63.
而下一个子表达式:
(number & 0x000000000000ff00) << 40
Run Code Online (Sandbox Code Playgroud)
这会掩盖位8-15,并将它们向左移动40,依此类推,依此类推.
如果是编写代码我会使用按位或者,|
而不是算术添加+
,因为在我看来它读得更好.