Big endian和little endian上的程序

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)

Dav*_*nan 6

对于无符号的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,依此类推,依此类推.

如果是编写代码我会使用按位或者,|而不是算术添加+,因为在我看来它读得更好.