Operadores bitwise y " endianness"


¿Importa la endianidad con las operaciones bitwise? ¿lógico o cambiante?

Estoy trabajando en la tarea con respecto a los operadores bitwise, y no puedo hacer cara o cruz en él, y creo que me estoy colgando bastante en la endianess. Es decir, estoy usando una pequeña máquina endian (como la mayoría lo son), pero ¿esto necesita ser considerado o es un hecho desperdiciado?

En caso de que importe, estoy usando C.

Author: Community, 2009-06-25

5 answers

La endianidad solo importa para el diseño de datos en memoria. Tan pronto como los datos son cargados por el procesador a operar, la endianidad es completamente irrelevante. Los cambios, las operaciones a nivel de bits, etc., funcionan como cabría esperar (los datos se presentan lógicamente como bits de orden bajo a alto) independientemente de la endianidad.

 66
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-25 00:04:20

Los operadores bit a bit abstraen el peso. Por ejemplo, el operador >> siempre desplaza los bits hacia el dígito menos significativo. Sin embargo, esto no significa que esté seguro de ignorar completamente la endianidad cuando los use, por ejemplo, cuando se trata de bytes individuales en una estructura más grande, no siempre puede asumir que caerán en el mismo lugar.

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];

Para aclarar, no estoy en desacuerdo básico con las otras respuestas aquí. El punto que estoy tratando de hacer es destacar que aunque los operadores bit a bit son esencialmente endian neutral, no se puede ignorar el efecto de "endian" en el código, especialmente cuando se combina con otros operadores.

 60
Author: 1800 INFORMATION,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-08 21:51:24

Como otros han mencionado, los cambios son definidos por la especificación del lenguaje C y son independientes de la endianidad, pero la implementación de un cambio a la derecha puede variar dependiendo de si la arquitectura usa el complemento de uno o el complemento de dos aritmética.

 4
Author: rpetrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-25 00:10:20

Depende. Sin lanzar el número en un nuevo tipo, se puede tratar la endianidad de forma transparente.

Sin embargo, si su operación implica algún nuevo tipo de fundición, entonces use su precaución.

Por ejemplo, si quieres cambiar algunas bits y cast (explícita o no) a un nuevo tipo, endianness importa!

Para probar su peso, usted puede simplemente lanzar un int en a char:

int i = 1;

char *ptr;

...

ptr = (char *) &i;  //Cast it here

return  (*ptr);
 2
Author: Rongkai Xu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-25 12:08:08

No ha especificado un lenguaje, pero por lo general, los lenguajes de programación como C abstract endianness away en operaciones bitwise. Así que no, no importa en operaciones bitwise.

 1
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-24 23:57:28