位运算的妙用,运算妙用

最近在学java,其实仅仅是在命令行里写程序跟C语言没有太大的区别,思想都是一样的。遇到了一个比较新鲜(后来知道原来C中也有)的东西——位元算(又叫位操作)。多新鲜啊,毕向东老师说这次(现在正在学习的这次)使用位元算符将会是你们今后使用的唯一的一次,因为在开发中根本用不着。其实也差不多。不过见到了几个应用,还是蛮有意思的,这里总结一下(万一考试就考到了呢,呵呵)。

Java中共有7个位运算符:~(取反)、&(与)、|(或)、^(异或)、>>(右移)、<>>(无符号右移)。这里不在解释位运算,只是谈谈几种位运算的有趣用法。(不知道位运算?看看这里)

加密

1 一个数异或同一个数两次还是原数;

2 计算机中的文件都是以二进制的形式来存储的;

利用这两个特性,我们就可以用^运算来给文件加密。例如将一个二进制文件中所有的数据都异或42这个数字,就得到了一个加密后的文件,“42”就是这个文件的“钥匙”。将这个文件中的所有数据再异或42,就完成了“解密”的过程。

不增加新的变量来交换a b两个变量的值

交换a b两个变量的值,几乎是每一个人在学编程的时候都要接触的。现在我们想这个问题,我有两个瓶子,A瓶装着果汁,B瓶装着醋,要是A瓶装醋,B瓶装果汁,如何做呢?通常,我们会用下面这段代码:

int temp;

temp = a;

a = b;

b = temp;

这就像我们找来一个新瓶子C,先将果汁倒入新瓶子,然后醋倒入A,果汁再倒入B。这是很容易想到的办法。那么如果没有别的瓶子了呢?看看这个:

a = a + b; //此时a包含a 和 b

b = a - b;

a = a - b;

只有两个瓶子,那么我们只好把它们倒在一起,然后将混合物中的果汁倒入B。不可思议是吗?别急,我们将果汁和醋倒在一起的时候,B瓶还在,这可是程序呀,B瓶仍然装着醋,这时我们就可以将(混合-醋)的值给B,也就是果汁,再将(混合-果汁)的值给A,完成!但是,这种方式有一个弊端:有可能a+b的值会超出int型的范围。

基于同样的想法,我们还可以用一下的代码:

a = a ^ b;

b = a ^ b; //实际上是(a^b)^b 也就是a异或了b两次,等号右边是a的值

a = a ^ b; //此时b里面已经是“果汁”,实际上是(a^b)^a,也就是b异或了a两次,是b

第一步之后,原来a占用了多少位依旧是多少位,绝对不会发生数据的溢出。

ps:为了程序的可读性,真正开发时要慎用后两种!

进制的转换(10进制转16进制为例)

接触位运算之前,进制转换我是这么操作的:

class turn10_16{

public static void main(String[] args){

int n=200; //n就是代转换的数字

boolean out_turn=false; //输出时用,去掉输出时候高位上的‘0’

int[] s=new int[20]; //将转换后的十六进制数存放在s[]数组中

while(n>0){

int i=0;

s[i]++;

while(s[i]>15){ //逢16进一,并且检查下一位

//是不是16,如果是,再进一

s[i]=0;

i++;

s[i]++;

}

n--; //数完一个之后n--,知道数完n个数

}

for(int i=19;i>=0;i--){

if(out_turn == false){ //这个if是为了去掉最高位上的0,

// 其中out_turn作为开关;

if(s[i]==0)

continue;

else{

out_turn=true;

i++;

}

}

else{ //输出转换之后的结果,10输出A,类推

if(s[i]<10)

System.out.print(s[i]);

else

System.out.print((char)('A'+(s[i]-10)));

}

}

System.out.println();

}

}

这种转换就像数数,一共有多少个,我来用十六进制的方法再数一遍,逢16进1,数完为止。这种方法的弊端就是效率低,而且不能转换负数。

我们知道,10进制的数据在计算机中使用2进制来存储的,而16进制的出现也是为了阅读性强,使4个位置放在一起计数。那么理论上,用“位运算”来操作,效率肯定会高。

class turn10_16{

public static void main(String[] args){

int n=200; //n就是代转换的数字

boolean out_turn=false; //输出时用,去掉输出时候高位上的‘0’

int[] s=new int[20]; //将转换后的十六进制数存放在s[]数组中

for(int i=0;i<=8;i++){ //int型占用了8个byte位置,每个byte即一个16进制,

//每次保留一个byte并且转换成16进制,至少要8次(可以优化)

int temp= n & 15; //与0000-0000 0000-0000 0000-0000 0000-1111进

// 行&运算,只保留最后4个位置即“个位”上的数

s[i]=temp; //将这个数赋给个位

n=n>>>4; //无符号右移4个位置,再保留出十位上的数

}

for(int i=19;i>=0;i--){

if(out_turn == false){ //这个if是为了去掉最高位上的0,其中out_turn作为

//开关;

if(s[i]==0)

continue;

else{

out_turn=true;

i++;

}

}

else{ //输出转换之后的结果,10输出A,类推

if(s[i]<10)

System.out.print(s[i]);

else

System.out.print((char)('A'+(s[i]-10)));

}

}

System.out.println();

}

}

总结:如此看来,位元算还是很有必要学习的。基于计算机只认识0和1,很多关于内存的操作用位运算效率会提高不少,毕竟我们是与计算机打交道。像 *2/2运算、取绝对值运算,取相反数运算等等,直接对内存进行移位或者反码,快了不少。

无论学习什么东西,基础、原理性质的东西一定要好好学。不要以为用的少了就不重视。

更多位元算的功能:911博客  csdn/人在江湖

java反码算术运算求和,位运算的妙用,运算妙用相关推荐

  1. Java整形位运算避免精度缺失,中国大学MOOC: 在Java语句中,位运算操作数只能为整型或______数据。...

    中国大学MOOC: 在Java语句中,位运算操作数只能为整型或______数据. 答:字符型 YEAR(date)函数返回值的数据类型是 答:int 青色食物应 木,红色食物应 火,黄色食物应 土,白 ...

  2. java乘以2的位计算符号_java编程之:按位与运算,等运算规则

    按位与运算符(&) 参加运算的两个数据,按二进制位进行"与"运算. 运算规则:0&0=0;   0&1=0;    1&0=0;     1& ...

  3. Java字节转换为比特位及相关

    文章目录 字节转换为比特位字串 直接上代码: 测试: 说明: 字节(byte).比特位.整型(int) 原码.反码和补码 移位运算符 >> 有符号,右移 >>> 无符号, ...

  4. java乘方运算符号_Java 4. 运算符号

    java运算符 运算符 用来指明对于操作数的运算方式 按照操作数的数目来进行分类 单目 双目 三目 a++ a+b (a>b)?x:y; 按照运算符的功能来进行分类 算术运算符 [+ - * / ...

  5. Java中「与运算,或运算,异或运算,取反运算。」

    Java中「与运算,或运算,异或运算,取反运算.」 文章目录 Java中「与运算,或运算,异或运算,取反运算.」 Java中的「与运算(AND) & 」 规则 :都为1时才为1,否则为0 Ja ...

  6. java 与或_Java 语言中的逻辑与 () 和逻辑或 (||) 运算采用 方式进行运算。_学小易找答案...

    [单选题]明清时期,"龙门账"按经济业务性质进行分门别类的登记在账簿"进"."缴"."存"和"()" ...

  7. java的7种位运算符

    java的7种位运算符 1 概述 2 七种位运算符的运算规则 2.1 &按位与运算符 2.2 |按位或运算符 2.3 ~取反运算符 2.4 ^异或运算符 2.5 <<左移运算符 2 ...

  8. java,javascript对18位身份证格式的验证算法

    参考资料  1 java实现的18位身份证格式验证算法  http://fanqiang.chinaunix.net/program/java/2006-06-22/4639.shtml   原码中有 ...

  9. java怎么保留两位小数?具体方法是什么?

    很多小伙伴在使用java的时候可能会遇到这样的需求:一个浮点型的数据,我只需要保留两位小数即可.而现实中往往的输出情况却大相径庭.其实这都是数据没有进行格式化的结果,java提供了很多方法来进行数据格 ...

最新文章

  1. WMI技术介绍和应用——查询桌面信息
  2. Linux下截取指定时间段日志并输出到指定文件
  3. python遍历指定文件夹的所有文件_python 统计指定文件夹下所有的文件数量,BFS方式...
  4. python字符串标签转化_如何在TensorFlow中将字符串标签转换为一个热向量?
  5. Shell——变量详解及注意点
  6. CentOS下mysql安装
  7. 一次清空所有数据方法
  8. 关于Android工程师转成vue的三两事儿(4)--webpack
  9. 记一次在Tomcat部署项目后无法启动该项目的例子
  10. WinRAR 5.21 32位+64位 烈火中文美化破解版(最流行的压缩解压工具)
  11. 工具 IDA Pro
  12. 华为云总裁称云计算市场第二场竞争刚开始 | 搜狗纽交所上市,市值近53亿美元
  13. DLL中无法定位程序输入点inflateReset2于动态链接库
  14. 【BLDC理论篇】直流无刷电机控制方法
  15. 企业如何实现IoT物联网远程控制
  16. ifconfig 下面的一些字段(errors, dropped, overruns)
  17. java体育管理系统6,基于JAVA的体育场馆预约管理系统的设计与实现.docx
  18. CC2430 串口通信UART
  19. 朋友圈炫富骗局曝光:那些“高端”的骗子是怎么骗人的?
  20. mysql sysbench 教程_mysql sysbench 使用方法!

热门文章

  1. matlab线性拟合和非线性拟合,matlab多元非线性拟合
  2. python数据科学实践指南_《Python数据科学实践指南》——导读-阿里云开发者社区...
  3. 深入理解函数式编程之柯里化
  4. 详解get与post请求方式、content-type与responseType、@Requestbody与@Requestparam的使用场景
  5. DbUtils使用原理详解【不懂的来】
  6. Web前端开发笔记——第四章 JavaScript程序设计 第一节 JavaScript的基础语法
  7. 单片机编程php,STC单片机内部FLASH读写程序(最新整理)
  8. 一个女程序员的第七年工作总结
  9. Android对话框dialog大全(代码直接可用)
  10. linux安装mysql5.6.14_(四)Zabbix_linux安装mysql5.6