Para alterar el bit de una palabra, dependerá del estado actual del bit que se quiera cambiar:
Si está a “1″ y lo queremos poner a “0″, se multiplica la posición de bit por 0 (AND)
Si está a “0″ y lo queremos poner a “1″, se suma 1 a la posición de bit (OR)
La función quedaría:
INT FUNCTION EscribeBit(INT Valor, INT NumBit, INT EstadoBit)
IF EstadoBit = FALSE THEN RETURN Valor BITAND (4294967295 BITXOR Pow(2, NumBit));
ELSE RETURN Valor BITOR Pow(2, Numbit);
END
END
Categoria:
Divagaciones varias
Esta muy bien.
Una pregunta ¿ de donde sacas el valor 4294967295 ? porque yo hasta ahora usaba un -1, la función que yo tengo es practicamente identica pero cambia ese valor.
Ya me dirás que es por saberlo por si acaso me sirve de algo en alguna ocasión.
Saludos amigo.
prueba a pasar 32 “unos” a decimal… (tu -1 debe dar el overflow y, por tanto, el máximo, creo)
el -1 da el overflow si, y como en teoria no puede ser un valor negativo el resultado es el mismo. Perdona pero no me dio por calcular el valor que pones en el ejemplo a binario, no cai en el asunto, siempre he utilizado el -1 por comodidad/vagancia o es la costumbre de Pascal que funciona asi.
Un saludo.
Nosotros lo utilizábamos antes pero nos encontramos que la función pow es muy lenta para ejecutarse y ahora lo hacemos de esta forma:
INT iPesoBits[32]=1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648;
INT FUNCTION AEToggleBit(INT Word, INT Bit)
IF (Word BITAND iPesoBits[bit])=0 THEN
RETURN SetBit(Word, Bit);
ELSE
RETURN ResetBit(Word, Bit);
END
END
INT FUNCTION SetBit(INT Word, INT Bit)
RETURN (Word BITOR iPesoBits[bit]);
END
INT FUNCTION ResetBit(INT Word, INT Bit)
RETURN (Word BITAND (0xFFFFFFFF BITXOR iPesoBits[bit]));
END