[20251206]混合16进制与10进制的计算.txt
--//有时候需要16进制与10进制数值的混合计算,使用bc就比较麻烦或者很难实现。
--//使用gdb相对简单
$ echo "p /d 0xa+10" | gdb -q
(gdb) $1 = 20
(gdb) quit
$ echo "p /x 0xa+10" | gdb -q
(gdb) $1 = 0x14
(gdb) quit
--//顺便贴一个dc的例子0xa+11:
$ echo "16 i A A i 11 + 16 opq" | dc
15
$ echo "16 i A A i 11 + 10 opq" | dc
21
--//简单说明:
--//16 i 表示输入16进制值,输入数值A,注意dc 16进制要使用大写英文字符。
--//A i 表示输入10进制值,因为前面16i已经确定输入16进制,这里只能输入A表示10进制,输入数值11
--//16 o 表示输出16进制。
--//先输入10进制可以这样写。
$ echo "11 16 i A + 16 opq" | dc
21
--//奇怪这样前面会出现1个空格。
--//我以前写过一个map在linux下在vim下使用。
# cat /usr/share/vim/vim74/plugin/gdb.vim
"" gdb Low version for linux
""noremap <Leader>px Yp!!sed -e 's+^+p /x +' >\| /tmp/gdb.txt && gdb -q -x /tmp/gdb.txt \| awk 'NR==1{print $NF}'<CR>kA = <ESC>J
""noremap <Leader>pd Yp!!sed -e 's+^+p /d +' >\| /tmp/gdb.txt && gdb -q -x /tmp/gdb.txt \| awk 'NR==1{print $NF}'<CR>kA = <ESC>J
""noremap <Leader>po Yp!!sed -e 's+^+p /o +' >\| /tmp/gdb.txt && gdb -q -x /tmp/gdb.txt \| awk 'NR==1{print $NF}'<CR>kA = <ESC>J
""noremap <Leader>pt Yp!!sed -e 's+^+p /t +' >\| /tmp/gdb.txt && gdb -q -x /tmp/gdb.txt \| awk 'NR==1{print $NF}'<CR>kA = <ESC>Ji0b
""noremap <Leader>pb Yp!!sed -e 's+^+p /t +' >\| /tmp/gdb.txt && gdb -q -x /tmp/gdb.txt \| awk 'NR==1{print "0b"$NF}'<CR>kA = <ESC>J
"" gdb high version for linux
noremap <Leader>px Yp!!sed -e 's+^+p /x +' \| gdb -q \| awk 'NR==1{print $NF}'<CR>kA = <ESC>J
noremap <Leader>pd Yp!!sed -e 's+^+p /d +' \| gdb -q \| awk 'NR==1{print $NF}'<CR>kA = <ESC>J
noremap <Leader>po Yp!!sed -e 's+^+p /o +' \| gdb -q \| awk 'NR==1{print $NF}'<CR>kA = <ESC>J
noremap <Leader>pt Yp!!sed -e 's+^+p /t +' \| gdb -q \| awk 'NR==1{print $NF}'<CR>kA = <ESC>Ji0b
"" gdb for windwows, you must be installl cygwin + gdb.
"" noremap <Leader>px Yp!!sed -e "s+^+p /x +" \| gdb -q \| gawk "NR==1{print $NF}"<CR>kA = <ESC>J
"" noremap <Leader>pd Yp!!sed -e "s+^+p /d +" \| gdb -q \| gawk "NR==1{print $NF}"<CR>kA = <ESC>J
"" noremap <Leader>po Yp!!sed -e "s+^+p /o +" \| gdb -q \| gawk "NR==1{print $NF}"<CR>kA = <ESC>J
"" noremap <Leader>pt Yp!!sed -e "s+^+p /t +" \| gdb -q \| gawk "NR==1{print $NF}"<CR>kA = <ESC>Ji0b
"" noremap <Leader>pb Yp!!sed -e "s+^+p /t +" \| gdb -q \| gawk "NR==1{printf "\0b\%s",$NF}"<CR>kA = <ESC>J
"" noremap <Leader>pb Yp!!sed -e "s+^+p /t +" \| gdb -q \| gawk "NR==1{print \"0b\"$NF}"<CR>kA = <ESC>J
--//bash shell也可以进行如下操作。
$ echo $(( 0xa+10 ))
20
$ printf "0x%x\n" $(( 0xa+10 ))
0x14
--//当然缺点不支持太大的数值进行计算,最大0x7fffffffffffffff.大于它变成负数,也可以使用中括号代替2个括号。
$ echo $[ 0x7fffffffffffffff ] $[ 0x8000000000000000 ] $[0xffffffffffffffff]
9223372036854775807 -9223372036854775808 -1
--// 带小数点的也不行。
$ echo $[ 12.2+2 ]
-bash: 12.2+2 : syntax error: invalid arithmetic operator (error token is ".2+2 ")
--//我以前在vim写了一个小插件bccalc_linux.vim,仅仅实现10->16,16->10,16->16.
--//16与10进制的混合运算一直没有实现,bc实现难度太大,使用bash这个功能相对简单,做一点点更新。
"" computer && convert hexadecimal or convert to hexadecimal or convert
noremap <Leader>jd YpIecho $[ <ESC>A ]<ESC>!!bash<CR>kA = <ESC>J
noremap <Leader>jh YpIprintf "0x%x\n" $[ <ESC>A ]<ESC>!!bash<CR>kA = <ESC>J
vnoremap <Leader>jd mz"fy'><ESC>o<ESC>"fpIecho $[ <ESC>A ]<ESC>!!bash<CR>y$d$`za = <ESC>pJ
vnoremap <Leader>jh mz"fy'><ESC>o<ESC>"fpIprintf "0x%x\n" $[ <ESC>A ]<ESC>!!bash<CR>y$d$`za = <ESC>pJ
--//顺便还发现该插件linux版本存在一些小问题,另外写一篇文章。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3105149/ ,如需转载,请注明出处,否则将追究法律责任。