代码之家  ›  专栏  ›  技术社区  ›  pdwetz

按位逻辑

  •  7
  • pdwetz  · 技术社区  · 17 年前

    我目前正在使用.NET2.0,它使用XSLT1.0。

    4 回复  |  直到 17 年前
        1
  •  14
  •   Daniel Brückner    17 年前

    XSLT是 Turing-complete ,例如见 here 或 here 因此,这是可以做到的。但我只使用过一两次XSLT,无法给出任何解决方案。

    使现代化

    bitset(x, n) 如果 n -第位 x

    bitset(x, n) := floor(x / 2^n) mod 2 == 1
    

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:template match="/">
        <html>
          <body>
            <table border="1" style="text-align:center;">
              <tr bgcolor="#9acd32">
                <th>Number</th>
                <th>Bit 3</th>
                <th>Bit 2</th>
                <th>Bit 1</th>
                <th>Bit 0</th>
              </tr>
              <xsl:for-each select="numbers/number">
                <tr>
                  <td>
                    <xsl:value-of select="."/>
                  </td>
                  <td>
                    <xsl:choose>
                      <xsl:when test="floor(. div 8) mod 2 = 1">1</xsl:when>
                      <xsl:otherwise>0</xsl:otherwise>
                    </xsl:choose>
                  </td>
                  <td>
                    <xsl:choose>
                      <xsl:when test="floor(. div 4) mod 2 = 1">1</xsl:when>
                      <xsl:otherwise>0</xsl:otherwise>
                    </xsl:choose>
                  </td>
                  <td>
                    <xsl:choose>
                      <xsl:when test="floor(. div 2) mod 2 = 1">1</xsl:when>
                      <xsl:otherwise>0</xsl:otherwise>
                    </xsl:choose>
                  </td>
                  <td>
                    <xsl:choose>
                      <xsl:when test="floor(. div 1) mod 2 = 1">1</xsl:when>
                      <xsl:otherwise>0</xsl:otherwise>
                    </xsl:choose>
                  </td>
                </tr>
              </xsl:for-each>
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    

    将打开此XML

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <numbers>
      <number>0</number>
      <number>1</number>
      <number>2</number>
      <number>3</number>
      <number>4</number>
      <number>5</number>
      <number>6</number>
      <number>7</number>
      <number>8</number>
      <number>9</number>
      <number>10</number>
      <number>11</number>
      <number>12</number>
      <number>13</number>
      <number>14</number>
      <number>15</number>
    </numbers>
    

    输入一个HTML文档,其中有一个显示数字位的表。

    Number | Bit 3 | Bit 2 | Bit 1 | Bit 0 
    ---------------------------------------
       0   |   0   |   0   |   0   |   0 
       1   |   0   |   0   |   0   |   1 
       2   |   0   |   0   |   1   |   0 
       3   |   0   |   0   |   1   |   1 
       4   |   0   |   1   |   0   |   0 
       5   |   0   |   1   |   0   |   1 
       6   |   0   |   1   |   1   |   0 
       7   |   0   |   1   |   1   |   1 
       8   |   1   |   0   |   0   |   0 
       9   |   1   |   0   |   0   |   1 
      10   |   1   |   0   |   1   |   0 
      11   |   1   |   0   |   1   |   1 
      12   |   1   |   1   |   0   |   0 
      13   |   1   |   1   |   0   |   1 
      14   |   1   |   1   |   1   |   0 
      15   |   1   |   1   |   1   |   1 
    

    这既不优雅也不友好,可能有更简单的解决方案,但它是有效的。鉴于这是我第一次接触XSLT,我非常满意。

        2
  •  3
  •   Grzegorz Oledzki    17 年前

    someone implementing this kind of operations manually . 如果你真的需要的话,也许你可以用同样的方法。

        3
  •  3
  •   Pavel Minaev    17 年前

    如果您专门在.NET 2.0上下文中使用XSLT,也就是说, XslCompiledTransform

    <xsl:stylesheet xmlns:bitwise="urn:bitwise">
    
      <msxsl:script language="CSharp" implements-prefix="bitwise">
      <![CDATA[
        public int and(int x, int y) { return x & y; }
        public int or(int x, int y) { return x | y; }
        ...
      ]]>
      </msxsl:script>
    
      ...
    
      <xsl:value-of select="bitwise:and(@foo, @bar)" />
      <xsl:value-of select="bitwise:or(@foo, @bar)" />
      ...
    
    </xsl:stylesheet>
    

    HasFlag ,然后使用它们。

    加载此类样式表时,您需要在其中显式启用脚本:

    XslCompiledTransform xslt = new XslCompiledTransform();
    xslt.Load("foo.xsl",
      new XsltSettings { EnableScript = true },
      new XmlUrlResolver());
    
        4
  •  1
  •   Michael Dietrich    15 年前
    <xsl:value-of select="for $n in (128, 64, 32, 16, 8, 4, 2, 1) return if ((floor($var div $n) mod 2) = 1) then 1 else 0"/>
    

    这将返回变量的二进制数组(存储在$var中)

    顺便说一下,我使用了XPath2.0来实现这一点