我是python的新手,正在尝试用位操作来绕头,特别是使用中继板。在我正在使用的代码中,我看到:

class relay_data(dict):
address = {
        "1":"2",
        "2":"8",
        "3":"20",
        "4":"80",
        "5":"1",
        "6":"4",
        "7":"10",
        "8":"40",
        "all":"FF"
        }

def testBit(int_type, offset):
    mask = 1 << offset
    return(int_type & mask)

def get_relay_state( data, relay ):
    if relay == "1":
        return testBit(data, 1)
    if relay == "2":
        return testBit(data, 3)
    if relay == "3":
        return testBit(data, 5)
    if relay == "4":
        return testBit(data, 7)
    if relay == "5":
        return testBit(data, 2)
    if relay == "6":
        return testBit(data, 4)
    if relay == "7":
        return testBit(data, 6)
    if relay == "8":
        return testBit(data, 8)


有人可以解释get_relay_state()的工作原理吗?

最佳答案

这是简单的位算术:get_relay_state()确实将1左移relay个位置,然后用它掩盖data

因此,通常来说:它会检查relay的位是否已设置。但是映射不是线性的。

例如:

if relay == "1":
    return testBit(data, 1)
if relay == "3":
    return testBit(data, 5)


第一个if检查继电器是否设置为1,如果设置为1,则返回2(第二位)。
第二个if检查继电器是否设置为3,如果是,则返回20(第5位)。

数组relay_data的值与函数get_relay_state()的返回值一致。

如果该位置1,则最终表达式return(int_type & mask)返回TRUE,否则设置为FALSE

08-15 21:55