[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] Bitwise Operations:More efficient solution?


Subject: [xsl] Bitwise Operations:More efficient solution?
From: Eliot Kimber <ekimber@xxxxxxxxxxxx>
Date: Tue, 15 Feb 2011 16:41:02 -0600

I have implemented UTF-8 URI decoding in XSLT 2. It required that I
implement left-shift and bitwise AND operations. Left-shift is easy but
bitwise AND is a little more involved. My solution is below, but I'm
wondering if there's a more elegant and/or efficient way to do this?

My approach was based on info from Ken Holman's site that shows how to
calculate each bit of the byte. I do that and then sum the result of
multiplying the AND of each bit pair times the appropriate power of two.

  <xsl:function name="relpath:bitwiseAnd" as="xs:integer">
    <xsl:param name="byte1" as="xs:integer"/>
    <xsl:param name="byte2" as="xs:integer"/>

    <xsl:variable name="byte1Bit7" select="if (($byte1 mod 256) - ($byte1
mod 128) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte1Bit6" select="if (($byte1 mod 128) - ($byte1
mod 64) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte1Bit5" select="if (($byte1 mod 64)  - ($byte1
mod 32) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte1Bit4" select="if (($byte1 mod 32)  - ($byte1
mod 16) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte1Bit3" select="if (($byte1 mod 16)  - ($byte1
mod 8) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte1Bit2" select="if (($byte1 mod 8)   - ($byte1
mod 4) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte1Bit1" select="if (($byte1 mod 4)   - ($byte1
mod 2) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte1Bit0" select="if (($byte1 mod 2)  > 0) then 1
else 0" as="xs:integer"/>

    <xsl:variable name="byte2Bit7" select="if (($byte2 mod 256) - ($byte2
mod 128) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte2Bit6" select="if (($byte2 mod 128) - ($byte2
mod 64) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte2Bit5" select="if (($byte2 mod 64)  - ($byte2
mod 32) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte2Bit4" select="if (($byte2 mod 32)  - ($byte2
mod 16) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte2Bit3" select="if (($byte2 mod 16)  - ($byte2
mod 8) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte2Bit2" select="if (($byte2 mod 8)   - ($byte2
mod 4) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte2Bit1" select="if (($byte2 mod 4)   - ($byte2
mod 2) > 0) then 1 else 0" as="xs:integer"/>
    <xsl:variable name="byte2Bit0" select="if (($byte2 mod 2)  > 0) then 1
else 0" as="xs:integer"/>

    <xsl:variable name="result" as="xs:integer"
      select="
      (128 * $byte2Bit7 * $byte1Bit7) +
      (64 * $byte2Bit6 * $byte1Bit6) +
      (32 * $byte2Bit5 * $byte1Bit5) +
      (16 * $byte2Bit4 * $byte1Bit4) +
      (8* $byte2Bit3 * $byte1Bit3) +
      (4 * $byte2Bit2 * $byte1Bit2) +
      (2 * $byte2Bit1 * $byte1Bit1) +
      (1 * $byte2Bit0 * $byte1Bit0)
      "
    />
    <xsl:sequence select="$result"/>
  </xsl:function>

Cheers,

E.
--
Eliot Kimber
Senior Solutions Architect
"Bringing Strategy, Content, and Technology Together"
Main: 512.554.9368
www.reallysi.com
www.rsuitecms.com


Current Thread
Keywords