python-3.x 简单的方法来打印二进制数在组的半字节

ztyzrc3y  于 2023-04-08  发布在  Python
关注(0)|答案(7)|浏览(123)

为了提高可读性,我想以4(半字节)为一组打印一个二进制数,用下划线分隔。
例如:

9     => "1001"
60    => "0011_1100"
100   => "0110_0100"
63000 => "1111_0110_0001_1000"

我想知道是否有一个简单的方法来做到这一点。

1yjd4xko

1yjd4xko1#

将逻辑拆分为4个组并进行连接。

def gen(x):
    while x:
        yield bin(x % 16)[2:].zfill(4)
        x >>= 4

def nibble(x):
    return "_".join(gen(x))
quhf5bfb

quhf5bfb2#

尝试:

def bin_nibble(val):
    b = bin(val)[2:]
    new_b =  '_'.join([b[::-1][i:i+4][::-1] for i in range(0, len(b), 4)][::-1])

如果要添加前导零:

def bin_nibble(val):
    b = bin(val)[2:]
    new_b = '_'.join([b[::-1][i:i+4][::-1] for i in range(0, len(b), 4)][::-1])
    return ''.join(['0']*(4 - len(b) % 4 if len(b) % 4 != 0 else 0) + [new_b])
2ledvvac

2ledvvac3#

从最高到最低:

def binNibble(num):
    nibb = bin(num)[2:]
    k = 0 if len(nibb)%4 == 0 else 4-len(nibb)%4  # needs zeros?
    nibb = "0"*k + nibb                           # add them here
    return '_'.join(nibb[i:i+4] for i in range(0,len(nibb),4) ) # put _ in

for i in range(0,1152,127):
    print(i,":  ",binNibble(i))

输出:

0 :   0000
 127 :   0111_1111
 254 :   1111_1110
 381 :   0001_0111_1101
 508 :   0001_1111_1100
 635 :   0010_0111_1011
 762 :   0010_1111_1010
 889 :   0011_0111_1001
1016 :   0011_1111_1000
1143 :   0100_0111_0111

您的示例:

9 :   1001
   60 :   0011_1100
  100 :   0110_0100
63000 :   1111_0110_0001_1000
niknxzdl

niknxzdl4#

我已经实现了这个函数:

import math
def bin_nibble(val):
    num_bits = len(format(val, "b"))
    return "_".join(reversed([format((val>>shift*4)&0x0F, "04b") 
        for shift in range(math.ceil(num_bits/4))]))
hrysbysz

hrysbysz5#

@Tjaart,根据您的输入和预期输出,以下代码将按预期工作。

请尝试它,让我知道,如果它失败的任何您的输入。

"""
INPUTS AND EXPECTED OUTPUTS:-

    9     => "1001"
    60    => "0011_1100"
    100   => "0110_0100"
    63000 => "1111_0110_0001_1000"
"""
def get_binary(n):
    s = bin(n)[2:]; # Getting binary string

    strs = [];

    while s:
        l = len(s);     # Finding lenght of binary string

        if l > 4:
            strs.insert(0, s[l-4:]);
            s = s[:l-4];
        else:
            l = len(s);
            s = "0"*(4-l) + s;  # If length is not equal to 4 (modify it by adding 0s to front)
            strs.insert(0, s);
            s = "";

    return "_".join(strs);

# EXAMPLE 1
a = 9;
print(get_binary(a)); # 1001

# EXAMPLE 2
b = 60;
print(get_binary(b)); # 0011_1100

# EXAMPLE 3
c = 100;
print(get_binary(c)); # 0110_0100

# EXAMPLE 4
d = 63000;
print(get_binary(d)); # 1111_0110_0001_1000
ldxq2e6h

ldxq2e6h6#

使用str.format的另一种方法:

def bin_nibble(a, pad=4):
    b = '{:b}'.format(a)
    if len(b) % pad:
        b = '0' * (pad - (len(b) % pad)) + b
    return '_'.join(b[k:k+pad] for k in range(0, len(b), pad))

tests = [9, 60, 100, 63000]
for k in tests:
    print(bin_nibble(k))

输出:

1001
0011_1100
0110_0100
1111_0110_0001_1000
qacovj5a

qacovj5a7#

我相信最简单的方法是使用格式(或使用格式的f字符串)。

>>> format(63000, '019_b')
'1111_0110_0001_1000'

019_b表示0填充、19字符、“_”半字节分隔、二进制
如果你想要最少的半字节数,你可能需要做一些数学运算来替换格式中的19,或者添加更多的填充和字符串,用空字符串替换任何0000_
例如,对于任何32位数字使用039_b。对于64位数字,您将使用079_b,依此类推。

>>> format(100, '039_b').replace('0000_', '')
'0110_0100

相关问题