• Jueves 14 de Noviembre de 2024, 04:10

Autor Tema:  Desplazar Los Bits De Un Entero  (Leído 3678 veces)

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Desplazar Los Bits De Un Entero
« en: Lunes 31 de Mayo de 2004, 13:06 »
0
Buenas!!  :hola:

Necesito desplazar los bits de un número con el que trabajo para pasárselos a otro programa.  Me explico en hexadecimal:

Si tengo mi número :
       Num = &H1234
y lo desplazo 4 bits hacia la izquierda, me queda :
       Num = &H2340

esto es más o menos lo que quiero hacer, pero sé como puedo hacerlo.  Conoce alguien alguna función o rutina para hacerlo???
Me suena que en C no era muy dificil, pero en Visual Basic no tengo ni idea

gracias por las contestaciones

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Desplazar Los Bits De Un Entero
« Respuesta #1 en: Lunes 31 de Mayo de 2004, 17:20 »
0
Hola Tiquinho.

Creo que es necesario que puntualices algo más...

En vb es posible realizar algunas operaciones entre dos números a nivel de bits utilizando los operadores And, Or y Xor, esto sólo por curiosidad, porque para tu caso no creo que sirva de mucho...

Para poder desplazar un número n bits para un lado o para otro multiplica o divide respectivamente ese número por 2^n (dos elevado a n).

De todas formas por el ejemplo que muestras creo que lo que realmente necesitas es desplazar carácteres y no bits (bytes en todo caso). No conozco o recuerdo ninguna función vb que realice esto, sin embargo, no debe resultar difícil crear tu propia función truncando el resultado al tamaño que necesites.

Resumiendo: prueba este código en un form con 2 commandbutton y verás a que me refiero:
Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private dbl1 As Double
  5. private dbl2 As Double
  6.  
  7. Private Sub Form_Load()
  8.  
  9.     dbl1 = &H1234
  10.  
  11. End Sub
  12.  
  13. Private Sub btnDerecha_Click()
  14.        
  15.     dbl2 = dbl1 / 2 ^ 4
  16.    
  17.     Debug.Print "&H" & Hex(dbl1)
  18.     Debug.Print "&H" & Hex(dbl2)
  19.    
  20.     dbl1 = dbl2
  21.    
  22. End Sub
  23.  
  24. Private Sub btnIzq_Click()
  25.  
  26.     dbl2 = dbl1 * 2 ^ 4
  27.    
  28.     Debug.Print "&H" & Hex(dbl1)
  29.     Debug.Print "&H" & Hex(dbl2)
  30.    
  31.     dbl1 = dbl2
  32.  
  33. End Sub
  34.  
  35.  

Suerte.

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re: Desplazar Los Bits De Un Entero
« Respuesta #2 en: Lunes 31 de Mayo de 2004, 18:44 »
0
Hola Brroz :sorcerer: !
Diste en el clavo a la primera, lo que tengo q hacer es desplazar mis bits, :)

Pero había creado una función para multiplicar y dividir(según convenga) por 2, y me daba problemas de desbordamiento, por eso preguntaba si había alguna en visual, pero ya encontré el fallo en mi función(uno, que se cree q en un for, desde 0 a nBits van nBits, y no nBits + 1  :brickwall: ) y va de perlas :good:

De todas maneras gracias por preocuparte!Para la próxima intentaré dejar un día o dos entre duda y pregunta jeje :nosweat:


Por si a alguien le puede ayudar, dejo aquí mi función :
Código: Text
  1.  
  2.  
  3. Private Function Desplazar(Valor As Integer, Direccion As String, nBits As Integer) As Integer
  4. Dim i As Integer
  5. If Not 0 < nBits < 16 Then Err.Raise 1001, , "Número de bits a desplazar incorrecto"
  6. Desplazar = Valor
  7. If Direccion = "izq" Then
  8.     'Desplazamiento a la izquierda
  9.     For i = 1 To nBits
  10.         Desplazar = Desplazar * 2
  11.     Next i
  12. ElseIf Direccion = "dch" Then
  13.     'Desplazamiento a la derecha
  14.     For i = 1 To nBits
  15.         Desplazar = Desplazar \ 2
  16.     Next i
  17. End If
  18. End Function
  19.  
  20.  

(Mi fallo estaba en los for, q eran for i=0 to nBits,lo que tiene no fijarse  :whistling: )

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Desplazar Los Bits De Un Entero
« Respuesta #3 en: Lunes 31 de Mayo de 2004, 19:15 »
0
Cita de: "tiquinho"
Código: Text
  1.  
  2.  
  3. Private Function Desplazar(Valor As Integer, Direccion As String, nBits As Integer) As Integer
  4. Dim i As Integer
  5. If Not 0 < nBits < 16 Then Err.Raise 1001, , "Número de bits a desplazar incorrecto"
  6. Desplazar = Valor
  7. If Direccion = "izq" Then
  8.     'Desplazamiento a la izquierda
  9.     For i = 1 To nBits
  10.         Desplazar = Desplazar * 2
  11.     Next i
  12. ElseIf Direccion = "dch" Then
  13.     'Desplazamiento a la derecha
  14.     For i = 1 To nBits
  15.         Desplazar = Desplazar \ 2
  16.     Next i
  17. End If
  18. End Function
  19.  
  20.  
:( NOOOOOOOOOOOOO!!! :(

La complejidad de realizar un desplazamiento con ASM es 1. (C y Pascal tienen funciones (<<,>>;shl,shr) que hacen lo mismo que en ASM, no recuerdo en VB pero fija que debe tener)

Complejidad de realizar una multiplicación: 17 en promedio para 32 bits. Para división es algo mayor. (Multiplicación usa desplazamientos y sumas, prácticamente un desplazamiento y suma por cada bit 1 del número)

La complejidad de desplazar usando multiplicaciones: 17*promedio de bits desplazados. digamos 8, entonces = 136. Por lo tanto tu código es POR LO MENOS en promedio 136 veces más lento de lo que debería ser, sin contar otros detalles mayores!!. (Usas un montón de cosas sólo para hacer algo que viene ya incluido en todo procesador, en realidad es posible que el código sea tranquilamente hasta 400 veces más lento de lo que debería ser)

tiquinho

  • Miembro activo
  • **
  • Mensajes: 96
    • Ver Perfil
Re: Desplazar Los Bits De Un Entero
« Respuesta #4 en: Lunes 31 de Mayo de 2004, 19:30 »
0
Vale
Estoy totalmente de acuerdo contigo
Pero no sé qué función es  :(
Igual la solución del For es matar moscas a cañonazos(yo lo mejoré ya con una multiplicación\división por 2^nBits, que es sólo una instrucción en vez de 4 iguales), lo reconozco, pero mientras no tenga otra cosa...

Si sabes o la encuentras por algún lado, me la cuentas, pero mientras tanto me tengo que apañar con mi función superlenta, pq necesito hacerlo, y si no puedo hacerlo más rápido, pos tendré q hacerlo más lento,no?

A mi me gustaría hacerlo con alguna función q venga en Visual(por eso empecé esta discusión), pero no la encuentro y hasta ahora nadie me supo decir  :oops:

Si alguien la sabe, que avise, plis (la verdad es que a mi con que me funcione ya me llega, pero preferiría ser más eficiente,  :) )

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Desplazar Los Bits De Un Entero
« Respuesta #5 en: Lunes 14 de Junio de 2004, 18:15 »
0
Revisé la ayuda por todos lados y nada, parece que no tiene esos operadores. :(