代码之家  ›  专栏  ›  技术社区  ›  Sergey V.

R语言:使用二进制、八进制和十六进制文字

  •  1
  • Sergey V.  · 技术社区  · 1 年前

    如何使用二进制和八进制文字?

    我是R的新手。所以,当我开始使用二进制、八进制和十六进制的数字时,我假设在描述这些文字时使用标准前缀,即0b。。。对于二进制表示,0o。。。对于八进制和0x。。。用于十六进制。但事实上,我发现我只能使用十六进制文字,如0xFFF,其他使用会导致错误,如“错误:“0b1010”中的意外符号”或“0o123”中的错误:意外符号。

    那么,有没有机会以同样的方式使用二进制或八进制文字呢?或者,除了使用任何函数(如strto()、as.integer()、sprintf()或其他第三方包)之外,是否还有其他标准机制来处理所有这些基础?

    所有版本的语言和IDE都是最新的。

    1 回复  |  直到 1 年前
        1
  •  2
  •   SamR    1 年前

    转换为基数10

    你提到了基本函数 strtoi() 在你的问题中。您可以使用它来表示十六进制、八进制和十进制字符串,但不能表示二进制字符串: docs :

    选择基数的标准C规则是八进制常量(前缀 0 后面没有 x X )和十六进制常量(前缀 0x 0X )被解释为基数8和基数16;所有其它字符串被解释为基数10。

    x <- c(
        "255", # 255 in base 10
        "0xFF", # 255 in hex
        "0377" # 255 in octal
    )
    
    strtoi(x)
    # [1] 255 255 255
    

    我不知道为什么 "0b" 前缀字符串不包括在其中。只要将基指定为参数,仍然可以提供不带前缀的二进制字符串:

    strtoi("11111111", base = 2)
    # [1] 255
    

    从基数10转换

    你提到 sprintf() 它同样可以用于十六进制和八进制,但不能用于二进制。来自 docs :

    d, i, o, x, X :整数值, o 是辛醇, x 十、 是十六进制的(使用与代码相同的a-f大小写)。

    # cat() is so we get real new lines rather than "\n"
    cat(sprintf(
        paste(
            "Base ten: %d",
            "Hex: %x",
            "Octal: %o",
            sep = "\n"
        ),
        x, x, x
    ))
    # Base ten: 255
    # Hex: ff
    # Octal: 377
    

    对于二进制文件,可以使用 intToBits() 然而,这会返回一个带有许多尾随零的大端序原始向量,例如:

    intToBits(255)
    #  [1] 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    

    这可能不是你想要的。有关将其转换为更合适格式的各种方法,请参阅 Converting decimal to binary in R?