移位方式转换十进制到十六进制思路和代码实现

by pxz


发布于: 2013-11-16 所属分类: php 后端 c 算法 标签:  214


<h3 id="h3-u8BA1u7B97u4E00u4E2Au6570u7684u5341u516Du8FDBu5236u65B9u6CD5u601Du8DEF"><a name="计算一个数的十六进制方法思路" class="reference-link"></a><span class="header-link octicon octicon-link"></span>计算一个数的十六进制方法思路</h3><pre><code>int x = 60; int n1 = x & 15; // 获取60的最低四位, 用&15, 此是n1=12 int n2 = x >>> 4 & 15; //获取下一组最低四位, 通过右移四位再&15 , 此时 n2=3 注意要用>>>的右移, 因为要把所有1移光,负数用>>,左边补1,永远也移不完。 char _n1 = n1>9 ? (char)(n1 - 10 + 'A') : char(n1+48); //大于9, 转换成ABCDEF字符, 此时 _n1 = 'C' </code></pre><p>最终得到 3C<br>计算一个数的八进制方法类似</p> <h3 id="h3-1-c-"><a name="1 . c语言实现" class="reference-link"></a><span class="header-link octicon octicon-link"></span>1 . c语言实现</h3><pre><code>#include <stdio.h> //移位方法 十进制转十六进制 void int_to_16(long i_a, char * c_16_re) { int is_negative = 0; //如果是负数,先转换成正数 if (i_a < 0) { is_negative = 1; i_a = ~(i_a-1); } int i = 0; int t = i_a; int item; char items[50]; int c=0; //items count while(1) { i = i + 4; item = t & 15; //获取最低四位 if (item > 9) { items[c] = (char)(item - 10 + 'A'); //大于9的转换成 'ABCDEF' } else { items[c] = (char)(item+48); //小于9的转换成 char类型 } c++; t = i_a >> i; if (t==0) { break; } } //组装结果 if (is_negative) { sprintf(c_16_re, "%s", "-0x"); } else { sprintf(c_16_re, "%s", "0x"); } //c_16_re[c+2] = '\0'; for (c=c-1; c>=0; c--) { sprintf(c_16_re, "%s%c", c_16_re, items[c]); } } int main() { char re[50]; int i = -30; for (i=-30; i< 31; i++) { int_to_16(i, re); printf("%d = %s\n", i, re); } } </code></pre><h3 id="h3-2-php-"><a name="2 . php 实现" class="reference-link"></a><span class="header-link octicon octicon-link"></span>2 . php 实现</h3><pre><code><?php //转换到16进制 function int_to_16($a) { $is_negative = false; if ($a < 0) { $is_negative = true; $a = ~($a-1); } $i = 0; $t = $a; $tmp = array(); while(true) { $i = $i + 4; $item = $t & 15; if ($item > 9) { $item = chr($item - 10 + ord('A')); } $tmp[] = $item; $t = $a >> $i; if ($t == 0) { break; } } $tmp = array_reverse($tmp); return ($is_negative?'-0x':'0x') . implode('', $tmp); } $a = -16; for ($i = -30; $i<31; $i++) { echo $i . ' = '; echo int_to_16($i) . "\n"; } </code></pre>

发表评论

暂无评论

搜索
用户登陆