Deux petites fonctions de manipulations de chaines binaires

Voici deux petites fonction de manipulations de chaines binaires : l’une transforme en chaine de bits un décimal et l’autre compte le nombre de 1 d’une chaine binaire.

1 – transformation d’entier en chaine binaire


IF EXISTS(SELECT *  
          FROM   sys.objects  
          WHERE  type_desc = 'SQL_SCALAR_FUNCTION'  
            AND  name = 'F_DEC_TO_BIN'  
            AND  schema_id = SCHEMA_ID('dbo')  
   EXEC ('DROP FUNCTION dbo.F_DEC_TO_BIN');
GO                
CREATE FUNCTION dbo.F_DEC_TO_BIN (@N BIGINT)
RETURNS VARCHAR(256)
AS  
/*******************************************************************************
* Fred Brouard / SQLpro - 2011-09-15 - sqlpro.developpez.com - www.sqlspot.com *
********************************************************************************
* FONCTION dbo.F_DEC_TO_BIN : transforme un nombre décimal entier en chaine de *
*                             bits (chaine composée de zéros et de uns)        *
* PARAMETRES en sortie : chaîne de caractères ASCII longeur maximal 256        *
* en entrée : 1) @N grand entier                                               *
********************************************************************************
* Exemple : SELECT dbo.F_DEC_TO_BIN(12345) => 11000000111001                   *
*******************************************************************************/  
BEGIN
   DECLARE @BIN VARCHAR(256);
   SET @BIN = '';
   WHILE @N > 1
   BEGIN
      IF @N % 2 = 0
         SET @BIN = '0' + @BIN
      ELSE
         SET @BIN = '1' + @BIN
      SET @N = @N / 2;
   END;    
   RETURN CAST(@N AS CHAR(1)) + @BIN
END
GO

2 – comptage du nombre de zéros d’une chaine de bits


IF EXISTS(SELECT *  
          FROM   sys.objects  
          WHERE  type_desc = 'SQL_SCALAR_FUNCTION'  
            AND  name = 'F_COUNT_BIN_ONE'  
            AND  schema_id = SCHEMA_ID('dbo')  
   EXEC ('DROP FUNCTION dbo.F_COUNT_BIN_ONE');
GO    
CREATE FUNCTION dbo.F_COUNT_BIN_ONE (@BIN VARCHAR(256))
RETURNS TINYINT
AS
/*******************************************************************************
* Fred Brouard / SQLpro - 2011-09-15 - sqlpro.developpez.com - www.sqlspot.com *
********************************************************************************
* FONCTION dbo.F_COUNT_BIN_ONE : compte le nombre de 1 dans une chaine de bits *
*                                (chaine composée de zéros et de uns)          *
* PARAMETRES en sortie : entier "TINYINT"                                      *
* en entrée : 1) @BIN chaîne de caractères longeur maximale 256                *
* NOTA : en cas d'erreur dans la chaine (caractère autres que zéro et un) la   *
*        fonction renvoie NULL                                                 *
********************************************************************************
* Exemple : SELECT dbo.F_COUNT_BIN_ONE('11000000111001') => 6                  *
*******************************************************************************/  
BEGIN
    DECLARE @I SMALLINT, @NB TINYINT;
    SELECT @I = 1, @NB = 0;
    WHILE @I <= LEN(@BIN)
    BEGIN
       IF SUBSTRING(@BIN, @I, 1) NOT IN ('0', '1')
          RETURN NULL
       SET @NB = @NB + CAST(SUBSTRING(@BIN, @I, 1) AS TINYINT);
       SET @I = @I + 1
    END;
    RETURN @NB;
END;
GO

Exemple d’utilisation :

SELECT dbo.F_DEC_TO_BIN(12345) => 11000000111001
SELECT dbo.F_COUNT_BIN_ONE(dbo.F_DEC_TO_BIN(12345)) => 6

--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence  * * * * *

MVP Microsoft SQL Server

Laisser un commentaire