我正在阅读关于小端的大端,并遇到了这些概念
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 ))
基本上它的作用是什么?
当我使用(gcc -lrt -lm program_name)编译它时.i得到警告说
integer constant is too large for ‘long’ type
答案 0 :(得分:6)
该代码针对无符号64位数据类型在little endian和big endian之间执行切换。
查看第一个子表达式:
(number & 0x00000000000000ff) << 56
这会掩盖0-7位,并将它们向左移动56.所以它们现在占据位56-63。
下一个子表达式:
(number & 0x000000000000ff00) << 40
这会掩盖8-15位,并将它们向左移动40位。依此类推,等等。
如果正在编写代码,我会使用按位或|
,而不是算术添加,+
,因为在我看来,这样做会更好。