ITPub博客

首页 > 数据库 > Oracle > [20251206]混合16进制与10进制的计算.txt

[20251206]混合16进制与10进制的计算.txt

原创 Oracle 作者:lfree 时间:2025-12-12 20:20:37 9 删除 编辑

[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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969295