que hace esto?

25 views
Skip to first unread message

Daniel Gutson

unread,
Jul 16, 2020, 10:45:37 AM7/16/20
to cppba
a = !!(val & BYT_BCR_WPD)

y por qué está hecho de esa forma?

Es un pedazo de código de C del kernel.

--
Who’s got the sweetest disposition?
One guess, that’s who?
Who’d never, ever start an argument?
Who never shows a bit of temperament?
Who's never wrong but always right?
Who'd never dream of starting a fight?
Who get stuck with all the bad luck?

RFOG

unread,
Jul 16, 2020, 11:03:08 AM7/16/20
to cp...@googlegroups.com
¿Convertirlo todo a ceros o todo a unos, dependiendo del valor de la constante?

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/cppba/CAFdMc-0gpdq04ksjiMBDseZdvmWmqsqFxFzGHLxBo%3DYcU%3DhwFQ%40mail.gmail.com.

Enrique Nieloud

unread,
Jul 16, 2020, 1:32:44 PM7/16/20
to cp...@googlegroups.com
Hola!,

On Thu, Jul 16, 2020 at 11:45 AM Daniel Gutson <daniel...@gmail.com> wrote:
a = !!(val & BYT_BCR_WPD)


BYT.... debe ser una máscara.
Entonces, si VAL tiene ese bit encendido, el AND con val de da algún número distinto de cero.
Y la doble negación fuerza a que sea 1 o 0.

¿vamos bien?

 
--

Daniel Gutson

unread,
Jul 16, 2020, 1:53:36 PM7/16/20
to cppba
El jue., 16 de jul. de 2020 a la(s) 14:32, Enrique Nieloud (enie...@gmail.com) escribió:
Hola!,

On Thu, Jul 16, 2020 at 11:45 AM Daniel Gutson <daniel...@gmail.com> wrote:
a = !!(val & BYT_BCR_WPD)


BYT.... debe ser una máscara.
Entonces, si VAL tiene ese bit encendido, el AND con val de da algún número distinto de cero.
Y la doble negación fuerza a que sea 1 o 0.

¿vamos bien?

sí. Por qué está mal lo que dijo RFOG?
 

Enrique Nieloud

unread,
Jul 16, 2020, 2:11:12 PM7/16/20
to cp...@googlegroups.com
 Por qué está mal lo que dijo RFOG?
La verdad no termino de entender esa respuesta.
 
y por qué está hecho de esa forma?

Tengo curiosidad yo tmb.

Daniel Gutson

unread,
Jul 16, 2020, 2:37:36 PM7/16/20
to cppba
El jue., 16 de jul. de 2020 a la(s) 12:03, RFOG (rafael....@gmail.com) escribió:
¿Convertirlo todo a ceros o todo a unos, dependiendo del valor de la constante?

Tu problema me parece es que estás creyendo que es una operación bitwise, estás pensando en ~ en vez de !.
 

Gonzalo Bonigo

unread,
Jul 16, 2020, 2:57:25 PM7/16/20
to cp...@googlegroups.com
Que hace? -> Pareciera que intenta quedarse con la representación booleana del resultado del and lógico.
Por qué? -> Por culiado?

De que tipo son a, val y BYT_BCR_WPD?



--
Gonzalo Bonigo
Licenciado en Ciencias de la Computación

Debugging is twice as hard as writing the code in the first place. 
Therefore, if you write the code as cleverly as possible, you are, by 
definition, not smart enough to debug it.  -- Kernighan

Daniel Gutson

unread,
Jul 16, 2020, 3:21:16 PM7/16/20
to cppba
Porque quiere saber si el bit está encendido.

Asumamos que la máscara tiene un solo bit, y puede estar en cualquier posición.

Entonces al hacer !! lo lleva a boolean. Para mí es ingenioso.

Enrique Nieloud

unread,
Jul 16, 2020, 3:37:57 PM7/16/20
to cp...@googlegroups.com
Entonces al hacer !! lo lleva a boolean. Para mí es ingenioso.

está bueno, pero debe haber otra razón. Sino por qué no usar directamente val & BYT_BCR_WPD como booleano?

Rafael Ontivero

unread,
Jul 16, 2020, 3:56:06 PM7/16/20
to cp...@googlegroups.com

El 16 jul 2020, a las 20:37, Daniel Gutson <daniel...@gmail.com> escribió:



El jue., 16 de jul. de 2020 a la(s) 12:03, RFOG (rafael....@gmail.com) escribió:
¿Convertirlo todo a ceros o todo a unos, dependiendo del valor de la constante?

Tu problema me parece es que estás creyendo que es una operación bitwise, estás pensando en ~ en vez de !.
 

Justo lo dices, justo me doy cuenta. Lo escribí justo cuando iba a salir del trabajo y ya estaba pensando en la merienda más que en otra cosa. :-D

Rafael Ontivero

unread,
Jul 16, 2020, 3:57:54 PM7/16/20
to cp...@googlegroups.com
Vosotros que tenéis a mano el GCC, mirad el ensamblador generado con la doble negación en Release. Porque supongo será una generación de código específica del GCC. Mañana si me acuerdo lo pruebo en mi Visual C++.

El 16 jul 2020, a las 21:37, Enrique Nieloud <enie...@gmail.com> escribió:

Entonces al hacer !! lo lleva a boolean. Para mí es ingenioso.

está bueno, pero debe haber otra razón. Sino por qué no usar directamente val & BYT_BCR_WPD como booleano?

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.

Nicolás Brailovsky

unread,
Jul 16, 2020, 4:07:01 PM7/16/20
to cp...@googlegroups.com
> está bueno, pero debe haber otra razón. Sino por qué no usar directamente val & BYT_BCR_WPD como booleano?

El resultado está garantizado va a ser 1 o 0. Sin conocer el contexto de BYT_BCR_WPD diría que el `!!` es porque el autor sospecha que val&BYT_BCR_WPD puede, de alguna forma, tener una comparación con un valor explícito. (Y si no fuera parte del kernel hasta sospecharía que hay un `#define TRUE 1` detrás del idiom!)


On Thu, 16 Jul 2020 at 20:37, Enrique Nieloud <enie...@gmail.com> wrote:
Entonces al hacer !! lo lleva a boolean. Para mí es ingenioso.

está bueno, pero debe haber otra razón. Sino por qué no usar directamente val & BYT_BCR_WPD como booleano?

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.

Enrique Nieloud

unread,
Jul 16, 2020, 4:17:42 PM7/16/20
to cp...@googlegroups.com
> está bueno, pero debe haber otra razón. Sino por qué no usar directamente val & BYT_BCR_WPD como booleano?

El resultado está garantizado va a ser 1 o 0. Sin conocer el contexto de BYT_BCR_WPD diría que el `!!` es porque el autor sospecha que val&BYT_BCR_WPD puede, de alguna forma, tener una comparación con un valor explícito. (Y si no fuera parte del kernel hasta sospecharía que hay un `#define TRUE 1` detrás del idiom!)
 
claro, sí.

Daniel Gutson

unread,
Jul 17, 2020, 7:24:57 AM7/17/20
to cppba


El jue., 16 jul. 2020 4:37 p. m., Enrique Nieloud <enie...@gmail.com> escribió:
Entonces al hacer !! lo lleva a boolean. Para mí es ingenioso.

está bueno, pero debe haber otra razón. Sino por qué no usar directamente val & BYT_BCR_WPD como booleano?

En realidad no es a booleano, sino al intervalo 0..1. Es en C viejo, sin bool.


--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.

Carlos Cattaneo

unread,
Jul 17, 2020, 10:05:51 AM7/17/20
to cp...@googlegroups.com
Mucho más claro es escribir:

a = ((val & BYT_BCR_WPD) != 0)



Daniel Gutson

unread,
Jul 17, 2020, 10:31:28 AM7/17/20
to cppba
El vie., 17 de jul. de 2020 a la(s) 11:05, Carlos Cattaneo (carlosca...@gmail.com) escribió:
Mucho más claro es escribir:

a = ((val & BYT_BCR_WPD) != 0)

Coincido.
 

Daniel Gutson

unread,
Jul 17, 2020, 10:37:48 AM7/17/20
to cppba
Y me salto la duda, si != 0 es mas eficiente que !!, pero no, en gcc, ya con -O1 se da cuenta que hacen lo mismo. Esto es con -O2
image.png

Enrique Nieloud

unread,
Jul 17, 2020, 2:56:28 PM7/17/20
to cp...@googlegroups.com
On Fri, Jul 17, 2020 at 11:37 AM Daniel Gutson <daniel...@gmail.com> wrote:
Y me salto la duda, si != 0 es mas eficiente que !!, pero no, en gcc, ya con -O1 se da cuenta que hacen lo mismo. Esto es con -O2
image.png
 
De curioso, ¿esa captura de qué ambiente de trabajo es?

 
El vie., 17 de jul. de 2020 a la(s) 11:05, Carlos Cattaneo (carlosca...@gmail.com) escribió:
Mucho más claro es escribir:
a = ((val & BYT_BCR_WPD) != 0)

Nah... el otro era mucho más cheto, y todo el mundo sabe que ese es el criterio cuenta!
 

Rafael Ontivero

unread,
Jul 17, 2020, 3:14:21 PM7/17/20
to cp...@googlegroups.com
Se me olvidó por completo a mi, leches.

En Visual C++, con las optimizaciones normales de release, me lo pone inline con una sola instrucción, y si le digo que no optmice main() pero sí lo otro, usa f tanto llamando a f() como a g()… Sabe que es exactamente lo mismo, y cuando menos el código es curioso:



Esto con optimización Release:

Y este es el código fuente:


El 17 jul 2020, a las 20:56, Enrique Nieloud <enie...@gmail.com> escribió:

On Fri, Jul 17, 2020 at 11:37 AM Daniel Gutson <daniel...@gmail.com> wrote:
Y me salto la duda, si != 0 es mas eficiente que !!, pero no, en gcc, ya con -O1 se da cuenta que hacen lo mismo. Esto es con -O2
<image.png>
 
De curioso, ¿esa captura de qué ambiente de trabajo es?
 
El vie., 17 de jul. de 2020 a la(s) 11:05, Carlos Cattaneo (carlosca...@gmail.com) escribió:
Mucho más claro es escribir:
a = ((val & BYT_BCR_WPD) != 0)

Nah... el otro era mucho más cheto, y todo el mundo sabe que ese es el criterio cuenta!
 
--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.

Carlos Bederián

unread,
Jul 17, 2020, 3:16:51 PM7/17/20
to CPPBA
On Fri, Jul 17, 2020 at 3:56 PM Enrique Nieloud <enie...@gmail.com> wrote:


On Fri, Jul 17, 2020 at 11:37 AM Daniel Gutson <daniel...@gmail.com> wrote:
Y me salto la duda, si != 0 es mas eficiente que !!, pero no, en gcc, ya con -O1 se da cuenta que hacen lo mismo. Esto es con -O2
image.png
 
De curioso, ¿esa captura de qué ambiente de trabajo es?

 
El vie., 17 de jul. de 2020 a la(s) 11:05, Carlos Cattaneo (carlosca...@gmail.com) escribió:
Mucho más claro es escribir:
a = ((val & BYT_BCR_WPD) != 0)

Nah... el otro era mucho más cheto, y todo el mundo sabe que ese es el criterio cuenta!
 

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.

Daniel Gutson

unread,
Jul 17, 2020, 4:29:19 PM7/17/20
to cppba
El vie., 17 de jul. de 2020 a la(s) 15:56, Enrique Nieloud (enie...@gmail.com) escribió:


On Fri, Jul 17, 2020 at 11:37 AM Daniel Gutson <daniel...@gmail.com> wrote:
Y me salto la duda, si != 0 es mas eficiente que !!, pero no, en gcc, ya con -O1 se da cuenta que hacen lo mismo. Esto es con -O2
image.png
 
De curioso, ¿esa captura de qué ambiente de trabajo es?

 
El vie., 17 de jul. de 2020 a la(s) 11:05, Carlos Cattaneo (carlosca...@gmail.com) escribió:
Mucho más claro es escribir:
a = ((val & BYT_BCR_WPD) != 0)

Nah... el otro era mucho más cheto, y todo el mundo sabe que ese es el criterio cuenta!
 

--
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
---
Has recibido este mensaje porque estás suscrito al grupo "CyC++ Buenos Aires" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cppba+un...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages