按位运算符和“字节顺序”
按位操作, sorting是否完全重要? 无论是逻辑还是移位?
我正在做一些关于按位运算符的功课,我不能在头脑上做什么,而且我想我已经被挂在头上了。 也就是说,我正在使用一个小型机器(就像大多数机器一样),但这是需要考虑还是被浪费的事实呢?
如果有问题,我使用C.
字节顺序只对内存中的数据布局很重要。 一旦数据被处理器加载操作,字节序是完全无关紧要的。 位移,按位操作等按照您的预期执行(数据在逻辑上按照低位从高到低排列),而不pipe字节顺序如何。
按位运算符抽象出字节序。 例如, >>
操作符总是将这些位移向最低有效位。 但是,这并不意味着在使用它们时完全忽略字节顺序是安全的,例如,在处理较大结构中的单个字节时,不能总是假设它们会落在同一个地方。
short temp = 0x1234; temp = temp >> 8; // on little endian, c will be 0x12, on big endian, it will be 0x0 char c=((char*)&temp)[0];
澄清一下,我在这里没有与其他答案基本不一致。 我试图强调的是,虽然按位运算符本质上是endian中性的,但是不能忽视代码中的endianess的影响,尤其是当与其他运算符结合使用时。
正如其他人所提到的,移位是由C语言规范定义的,并且独立于字节序,但是右移的实现可以根据体系结构使用补码还是二进制补码algorithm而变化。
你还没有指定一种语言,但通常情况下,编程语言如C抽象字节序列在按位运算。 所以不,在按位操作中并不重要。
这取决于。 不需要将数字转换为新的types,可以透明地处理字节序。
但是,如果您的操作涉及到一些新types的投射,请谨慎使用。
例如,如果你想右移一些位并且把(显式地或不是显式地)转换成新的types,字节顺序是很重要的。
为了testing你的字节顺序,你可以简单地把一个int
转换成char
:
int i = 1; char *ptr; ... ptr = (char *) &i; //Cast it here return (*ptr);