python - 在 Python 中产生 2 次方的按位运算

标签 python bit-manipulation

在纯音调理论(音乐理论的一种)中,音符之间的音程用有理数表示。以 2:1 的比率将频率加倍可将其提升一个 Octave ,而 1:1 的比率则没有变化;齐声。因此,如果我有一个大于 Octave 或小于同音(下降)的音程 n,“证明”它是有用的。也就是说,要使 1 ≤ n ≤ 2。我一直在使用以下函数在 Python 中执行此操作:

def justify(n):
    return n / 2 ** floor( log(n,2) )

实际的功能涉及到分数库,但这通过 float 和整数来完成工作。对数找到 2 n 的幂次方,并将其向下舍入,以便生成的除数是 n 以下最接近的 2 次幂。我也试过这个:

def justify(n):
    return n / int( '1'.ljust( len( bin(n) ) - 2, '0' ), 2 )

这个只是取二进制表示的长度,并以此为基础补零。当然,这只适用于整数。我想知道是否有任何方法可以通过按位运算来执行此操作。二进制文件似乎很适合 2 操作的强大功能。至少,我希望看到一种用按位替换 2 ** floor( log(n,2) ) 的方法。如果它可以处理 float ,则加分,但我知道那更复杂。

最佳答案

math.frexp(x),正如 Mark Dickinson 在问题评论中指出的那样,是要走的路:

def justify(n):
    return 2*frexp(n)[0]

它适用于 float 和整数。

关于python - 在 Python 中产生 2 次方的按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28857930/

相关文章:

c - C 中两个寄存器之间的移位

javascript - 在 python 中将多种类型的元组表示为 JSON

function - 在 Python 中的函数之间传递值的最佳实践

c - strlen AVX-512 __builtin_ctz 无效值

C++ 为什么按位运算符 ~ 在 uint64_t 和 uint8_t 上返回不同的类型?

javascript - 如何将 64 位整数拆分为两个 32 位整数

python - 使用 QMediaPlayer.duration() 时总是得到 0

python - 在 Pygame 中点击幻灯片

python - 在 python 中查找命令失败,出现 "missing argument to -exec"

c - 获取字节 - 这是怎么错的?