gpt4 book ai didi

linux - Linux 中的高值变量

转载 作者:太空狗 更新时间:2023-10-29 12:40:34 24 4
gpt4 key购买 nike

我想读取一个二进制数,它的长度可以是 1 到 32 位之间的任意长度。

示例:1、10、101、10000001....10000000100000001000000010000000

现在,我要做的是计算所有出现 1 的位置并将它们相加。

示例:10001000(8 位数字)

按照二进制,第一个 1 排在第三位,第二个 1 排在第七位。

我想要的是最终得到结果10(即7+3)

示例输入:

10001000
100100
1000000000101
10010000001
100000001

示例输出:

10
7
14
17
8

注意:数字最多为 32 位。

我的代码:

  while read line
do
count1=0
count2=0
while [ $line -gt 0 ]
do
if (($line % 2 == 0))
then
count2=$(($count2+1))
line=$(($line/10))
else
line=$(($line/10))
count1=$(($count1+$count2))
count2=$(($count2+1))
fi
done
echo $count1
done < h2b.csv >> bit_count.csv

h2b.csv为输入文件,bit_count为输出文件。

这适用于较小的值,如 1001,1010,1100,但无法运行超过 16 位的大值数字。

运行脚本时的错误信息:

line 7: [: 1000000000000000000000: integer expression expected

最佳答案

使用 Awk

以此作为示例输入:

$ cat input
10001000
100100
1000000000101
10010000001
100000001

我们可以通过以下方式计算结果:

$ awk -F '' '{x=0; for (i=NF;i>0;i--) if ($i) x+=NF-i; print x}' input
10
7
14
17
8

工作原理

  • -F ''

    这告诉 awk 将每个字符视为一个单独的字段。

  • x=0

    这会将变量 x 初始化为零。

  • for (i=NF;i>0;i--) if ($i) x+=NF-i

    这就是总数。

  • 打印 x

    这会打印该行的总数。

一行很长的例子

此文件中的行长度为 106 个字符:

$ cat >input2
1000100010010010001000100000000100000100000000001000000000000110000000000001100000000000100000000110000001
$ wc input2
1 1 107 input2
$ awk -F '' '{x=0; for (i=NF;i>0;i--) if ($i) x+=NF-i; print x}' input2
1035

使用 bash

同理:

while read -r line
do
x=0
for ((i=${#line};i>0;i--))
do
[ ${line:$i-1:1} = 1 ] && ((x+=${#line}-i))
done
echo $x
done <input

这会产生输出:

10
7
14
17
8

关于linux - Linux 中的高值变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45886829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com