计算包含十六进制值的文件中的位1的数量

时间:2015-12-18 03:04:56

标签: vim

是否有快速计算hex文件中的数量? 该文件类似于表示十六进制值的序列:

13
ff
a0

在这种情况下,1的数量是3 + 8 + 2 = 13个数(在我们转换为二进制之后)。 现在我有数千条这样的行,在vi命令中有没有快速的方法呢?

1 个答案:

答案 0 :(得分:1)

(假设文件是​​ascii hex,如果不在python中写一些东西应该不那么难)

稍微设置一下,你就可以很快地完成这项任务。

首先创建一个具有以下内容的文件。

let g:hex2popcount = {
            \ '0': 0, '1': 1, '2': 1, '3': 2,
            \ '4': 1, '5': 2, '6': 2, '7': 3,
            \ '8': 1, '9': 2, 'a': 2, 'b': 3,
            \ 'c': 2, 'd': 3, 'e': 3, 'f': 4}

function! Accum(var)
    let g:x += g:hex2popcount[a:var]
endfunction

hex2popcount dict是将16个十六进制字符映射到一位数的计数。然后我们创建一个名为Accum的函数,用于跟踪我们看到的位数。要在文件中的所有十六进制数字上运行此操作,我们将使用表达式替换n标记,该标记实际上不会执行任何替换。

let g:x = 0 | %s/\x/\=Accum(submatch(0))/gn | echo g:x

我们将g:x设置为零,然后对文件中的每个十六进制数字运行Accum(submatch(0))。替换完成后g:x包含一位数的总数。

确保在vim中提供文件。使用vim -S <file with accum function>:source <file with accum function>或将命令放在vimrc中。

相关帮助页面为:help sub-replace-expression:help :s_flags