说道位运算符,应该都了解,但是很少有人会用,在网上看别人的代码,我至今只见过一道题用到了位运算符,并被它深深的搞晕了(当然,他搞晕我是要负责的,我现在已经深深的迷上了他,真的是太神奇了),位运算符的原理容易懂,也都知道他运算的效率很高,但是他究竟怎么去用,用在什么地方,我想不少人都说不清楚,所以当我看到位运算符可以这么玩的时候,我感到很神奇!
首先,我们先来一个简单的程序来说明位运算符的神奇。
问题是:如何交换两个变量的值?
看到这个问题,我想九成的人会说定义第三方变量,通过第三方变量去交换值。
对,这是个很直观很容易想到的方式。但是我还知道两种不用第三方变量的方法,并且其中有一种方法最安全,最高效——利用位运算符(^)交换,简单,易记。(首先需要给大家一个公式,这个公式是实现这个方法的核心:a ^ b ^ b = a)
void exchange(int a, int b)
{a = a ^ b;b = a ^ b;a = a ^ b;return ;
}
看到这里,是不是十分不可思议?其实这很好理解,只要你知道(^)这个符号是怎么运算的,用笔写写画画就出来了……这里就不解释了,有兴趣的人去试试就成了。通过这个小算法,我想大家的兴趣就已经被吸引住了,那么我们就来尝尝我们的硬菜吧!
题:给定n个十六进制正整数,输出对应的八进制数。
题好理解,通常这样的问题,我们都先将其转换为2进制,再转成8进制的好,废话少说,代码如下。
#include <stdio.h>
#include <string.h>char str[100005], num;
void Fun(int i, int state)
{int temp;if(i < 0){if(num != 0)  //此时的num转二进制后的有效位数小于三位,即num小于8{printf("%d", num);}return;}if(state != 3){temp = str[i] >= '0' && str[i] <= '9' ? str[i] - '0' : str[i] - 'A' + 10;temp <<= state;  //state指每次将16进制转2进制后,截取最后三位后剩余几位num |= temp;     //把二进制的num和二进制的temp相加(等同于十进制之间的加,因为对应num位数的temp的后几位在上一步左移时填补了0)temp = num;num >>= 3;Fun(i - 1, state + 1);printf("%d", (temp & 1) + (temp & 2) + (temp & 4));  //相当于将temp转二进制后的最后三位取出并转8进制}else{temp = num;num >>= 3;Fun(i, 0);printf("%d", (temp & 1) + (temp & 2) + (temp & 4));}
}int main()
{int n;scanf("%d", &n);while(n--){num = 0;scanf("%s", str);Fun((int)strlen(str) - 1, 0);printf("\n");}return 0;
}
看到代码,我变成了一个大写的懵比,然后我决定跟它死磕到底,我拿出自己的法宝,笔和纸,自己一步一步模拟运行并尝试去理解每一步代码的意图(有的时候,编辑器的断点分步功能还没有我们的纸和笔用这方便快捷,我们可以前后对比着去发现代码中的一些奥妙)。
算法,我认为是不能细细的讲的,只能提供一个大致的思路,具体的过程需要自己去悟,因为只听那是容易变成懵比的,所以,我只能推荐你们去带入一个值去尝试着一步一步的往后推!这样有利于我们对代码的理解,大致的思路和方向我已经在代码中注释了,希望可以帮助大家去好好理解!

神奇的位运算——进制转换问题(16转8)相关推荐

  1. 计算机系统-理论-CPU操作/处理数据的方式/寻址方式/局部性原理/位运算/进制转换

    在计算机中,cpu将一切硬件,都看成内存,各种硬件在CPU的眼中都是下面这样子的 CPU对硬件的操作,其实就是和这些硬件的内存或者BIOS进行交互,CPU能做且只能做三件事 1.将某个地址中存储的字节 ...

  2. 10进制转换成16进制

    更新中......... 任意2-36进制数转化为10进制数. 建议自己写函数,代码如下: int Atoi(string s,int radix) //s是给定的radix进制字符串 {int an ...

  3. delphi10进制转换成16进制

    delphi中有直接把10进制转换成16进制的函数: function   IntToHex(Value:   Integer;   Digits:   Integer):   string;   o ...

  4. POJ - 1220 NUMBER BASE CONVERSION(高精度运算+进制转换+模拟)

    题目链接:点击查看 题目大意:给出两个进制x和y,再给出一个x进制下的数num,求num转换为y进制后的答案 题目分析:直接套模板就行了,进制转换没什么好说的,直接模拟,这个题开了加速外挂只能优化几十 ...

  5. 位运算 进制转化 STL中bitset用法

    2017-08-17 16:27:29 writer:pprp /* 题目名称:输入十进制以二进制显示 程序说明:同上 作者:pprp 备注:无 日期:2017/8/17 */ #include &l ...

  6. ASCII码直接16进制转换(16转换为0x16)

    字符平行转换16进制.记录一下. 例子:字符串 string str="16 22 0D" 转换为 byte[] byt = new byte[3];             by ...

  7. 进制转换,16进制与float互转

    #include <winsock.h> #pragma comment(lib, "Ws2_32.lib")//将一个8位数高低4位交换 static unsigne ...

  8. 10进制转16进制 java_Java中将10进制转换成16进制

    import java.util.Scanner; public class Decimal2HexConversion { public static void main(String[] args ...

  9. 进制转换(16转10)

    题目描述: 写出一个程序,接受一个十六进制的数,输出该数值的十进制表示. 原理分析: 输入的是字符串,要转换成整数.将字符'0'~'9','A'~'F'转化成对应的数字.不能直接转换,可通过做减法来实 ...

最新文章

  1. ios常见加密解密方法
  2. 老婆给当程序员的老公打电话:今天下班顺路买斤元宵……
  3. OpenGL ES 的例子
  4. IntelliJ IDEA的Maven项目在修改时报java.lang.OutOfMemoryError: PermGen space异常
  5. js对当前时间的相关操作
  6. django启动时同时使用Schedule启动其他程序
  7. 2017.7.31 征途 失败总结
  8. linux文件末尾 m,Linux7-删除nginx配置文件末尾的^M字符
  9. Cocos2d-x 3.2 大富翁游戏项目开发-第八部分 角色的散步路径
  10. 设置javadoc模板
  11. soap报文解析 php,soap 返回报文解析
  12. 字节跳动岗位薪酬体系曝光,看完感叹:我酸了
  13. 婚宴座位图html5,婚宴座位安排图 婚宴主桌安排示意图
  14. 阿里云认证攻略,考试注意事项
  15. C语言—求数组的对角线和副对角线之和
  16. Android RecyclerView设置paddingBottom,scrollbars跟随滑动到底部
  17. mysql js 命令行登录_MYSQL常用命令
  18. 证券行业基础知识(二)
  19. 试述现代计算机系统的多级层次结构,计算机系统结构测验题(一)答案.ppt
  20. 电脑翻译软件-大家都觉得好用的免费电脑翻译软件

热门文章

  1. python with open 文件不存在_python 文件不存在时才能写入,读写模式xt
  2. 惠更斯与巴罗,牛顿与胡克
  3. 妈妈,我居然在CDA经管之家学挑西瓜
  4. java 代码坏味道_代码中的坏味道
  5. JavaWeb之JavaMail使用
  6. maven配置国内源
  7. android 底部导航栏透明度,如何实现Android透明导航栏(Translucent Navigation Bar)?...
  8. 为沙发添加花纹(每天一个PS小项目)
  9. 带备忘录的动态规划【leetcode931】
  10. 打印机结构、原理及常见故障