`
sw1982
  • 浏览: 511403 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java人也不能忘记的~~位操作技巧

阅读更多

 一。数字运算与位运算

   在2进制里面,一个位只可能是0,或者1。 java里面支持的位运算有:

~ 按位非(NOT)
& 按位与(AND)
| 按位或(OR)
^ 按位异或(XOR

 

位操作需要跟逻辑操作区分开(逻辑运算符AND(&&)、OR(||)以及NOT(!)能生成一个布尔值(true或false)——以自变量的逻辑关系为基础) ,这里的区分的重点是敲代码不要敲错了。。。。

 

二。数字的表示

计算机数字有原码、反码、补码三种存储格式,通常都是补码(方便减运算),java也不例外的使用补码。

 

 

补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。

+7的补码为: 00000111 -7的补码为: 第一步:11111000,第二步+1=11111001

 


  

补码求具体值也概括两句话:

     正数补码的值就是本身值,负数补码的值分两步:

已知一个负数的补码,将其转换为十进制数,步骤:
      1、先对各位取反;
      2、将其转换为十进制数;
      3、加上负号,再减去1。

11111010,最高位为1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。

  

 三。具体运算解析:

可参考:http://www.itwis.com/html/java/j2se/20090223/3407.html

 

 

~ 按位取反操作符,对每个二进制位的内容求反,即1变成0,0变成1

测试负数:
int a = -5;//101;
System.out.println(~a);
打印:4
过程是这样的,首先表示出来这个负数
1111 1111 1111 1111 1111 1111 1111 1011(上面已经提到为什么这样表示)
各位取反得到
0000 0000 0000 0000 0000 0000 0000 0100
转为10进制得到4

 

测试正数:
int a = 5;//101;
System.out.println(~a);
打印:-6
首先表示出来这个正数:
0000 0000 0000 0000 0000 0000 0000 0101
各位取反得到:
1111 1111 1111 1111 1111 1111 1111 1010
这个代表的就是-6了,至于为什么看最上面

 

& 位与操作符,对应的二进制位进行与操作,两个都为1才为1,其他情况均为0
测试:
System.out.println(5&6);
打印:4
过程:
5表示成:0000 0000 0000 0000 0000 0000 0000 0101
6表示成:0000 0000 0000 0000 0000 0000 0000 0110
进行 & :0000 0000 0000 0000 0000 0000 0000 0100
得到:4

 

| 位或操作符,对应的二进制位进行或操作,两个都为0才为0,其他情况均为1
测试:
System.out.println(5|6);
打印:7
过程:
5表示成:0000 0000 0000 0000 0000 0000 0000 0101
6表示成:0000 0000 0000 0000 0000 0000 0000 0110
进行 | :0000 0000 0000 0000 0000 0000 0000 0111
得到:7

 

^ 异或操作符 当对应二进制位值相同,该位为0 否则为1
测试:
System.out.println(5^6);
打印:3
过程:
5表示成:0000 0000 0000 0000 0000 0000 0000 0101
6表示成:0000 0000 0000 0000 0000 0000 0000 0110
进行 ^ :0000 0000 0000 0000 0000 0000 0000 0011
得到:3

 

在Java中是左移、有符号右移和无符号右移运算符。位移运算符只对int值进行操作,如果不是int,编译器会报错。在Java中,一个int的长度始终是32bit,也就是4个字节。 

<< 逻辑左移,右边补0

左移后低位空出来的不论符号全部补0,最高位由于挪动可能导致0/1更替使得数字颠倒了正负。

 

>>带符号右移运算:
把操作数向右移动,移动的位个数同样由操作数指定。如果原值是正数,则高位补上0;如果原值是负数,高位补1。由于高位补0还是1跟正负有关,所以叫带符号右移
 

 

>>>无符号的右移运算
类似>>,区别在于:无论是正号还是负号,都在高位补0。
 

 

四。位操作技巧:

 

byte 与String转换

 //字节码转换成16进制字符串
 public static String byte2hex(byte bytes[]){
   StringBuffer retString = new StringBuffer();
   for (int i = 0; i < bytes.length; ++i)
   {
     retString.append(Integer.toHexString(0x0100 + (bytes[i] & 0x00FF)).substring(1).toUpperCase());
   }
   return retString.toString();
 }

 //将16进制字符串转换成字节码
 public static byte[] hex2byte(String hex) {
   byte[] bts = new byte[hex.length() / 2];
   for (int i = 0; i < bts.length; i++) {
      bts[i] = (byte) Integer.parseInt(hex.substring(2*i, 2*i+2), 16);
   }
   return bts; 
 }  

  

 c++里面最常用的mask技巧:

//第四位置1,加标志
Property|0x1000
//去掉第四位标志(置0)
Property&(~0x1000)
//判断是否有第四位标志属性
TEST(property&0x1000 == 0x1000)

 

  • 大小: 44.3 KB
  • 大小: 44.5 KB
  • 大小: 30.5 KB
分享到:
评论

相关推荐

    基于java的面试参考与学习资料

    最后,不要忘记学习Java的高级特性,如Lambda表达式(函数式编程)、Stream API、反射、注解和模块系统。这些特性极大地提高了代码的简洁性和可维护性。 在面试准备过程中,实践是检验理论的最好方式。通过编写代码...

    java-lintcode阶梯训练第四章

    【Java LintCode阶梯训练第四章】是一套针对Java编程者提升算法能力的训练课程,主要聚焦于通过解决LintCode平台上的实际问题来加强编程技巧和理解。LintCode作为一个在线编程练习平台,提供了丰富的算法题目,帮助...

    eclipse快捷键

    ### Eclipse 快捷键详解 #### 一、概述 Eclipse 是一款强大的开源集成开发环境(IDE),广泛应用于 Java 开发以及其他多种编程语言项目。...希望每位开发者都能充分利用这些强大的工具来提升自己的工作效率。

    三行代码显示程序员情商

    这里用来形容即使独自一人也能活出自己的风采。 #### 伤感之余,感慨人生版 **代码示例:** ```csharp Console.WriteLine("人生就像数组,总有结束的时候。"); ``` **解析:** C# 的 `Console.WriteLine` 方法...

    操作系统(内存管理)

    在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理器的能力与局限性至关重要。在大部分系统语言中,比如 C 和 C++,您必须进行内存管理...

    C#微软培训资料

    7.6 位 运 算 .69 7.7 其它特殊操作符 .72 7.8 小 结 .77 第八章 流 程 控 制 .79 8.1 条 件 语 句 .79 8.2 循 环 语 句 .86 8.3 条 件 编 译.90 8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 ...

    华为编程开发规范与案例

    在新的编程思想中,指针基本上被禁止使用(JAVA中就是这样),至少也是被限制使用。而在我们交换机的程序中大量使用指针,并且有增无减。 2、防止指针/数组操作越界 【案例1.2.1】 在香港项目测试中,发现ISDN话机...

    The C Cheat Sheet - An Introduction to Programming in C

    ### C语言快速参考指南...- Java的异常处理机制与C的错误处理方式也有所不同。 通过以上概述,我们可以看到C语言涵盖了从基础数据类型、控制结构到高级编程概念的广泛主题,为学习和掌握这门语言提供了坚实的基础。

    competitive-coding:收集竞争性编码问题

    8. **效率优化**:了解如何减少空间复杂度(如使用位运算、记忆化搜索等)和时间复杂度(如使用更高效的算法)是提升代码性能的关键。 9. **输入/输出**:学会使用Scanner和System.out.println()处理输入输出,以及...

    飞鸽传书(IPMessenger) 源码

    操作技巧  1、隐藏/显示窗口Ctrl+D  2、按住Ctrl键再点[刷新]可保持现有用户,搜索新上线的用户  3、打开发送/接收消息窗口Ctrl+Alt+S/R(需要进行详细设置)  4、打开搜索窗口Ctrl+F  5、接收到多个文件,保存...

    MySQL命令大全

    在进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如...

    飞鸽传书Ver2.06

    - 操作技巧. 1. 隐藏/显示 窗口 Ctrl + D 2. 按住 Ctrl 键再点 [刷新] 可保持现有用户, 搜索新上线的用户 3. 打开发送/接收消息窗口 Ctrl + Alt + S / R (需要进行详细设置) 4. 打开搜索窗口 Ctrl ...

    飞鸽传书Ver2.06源码

    - 操作技巧. 1. 隐藏/显示 窗口 Ctrl + D 2. 按住 Ctrl 键再点 [刷新] 可保持现有用户, 搜索新上线的用户 3. 打开发送/接收消息窗口 Ctrl + Alt + S / R (需要进行详细设置) 4. 打开搜索窗口 Ctrl ...

    网管教程 从入门到精通软件篇.txt

    /p 即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。 /r 找到坏扇区并恢复可读取的信息。隐含着 /p 参数。  注意 Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录...

    javascript-ufo

    1. **基本语法**:变量声明(var、let、const)、数据类型(字符串、数字、布尔、null、undefined、对象、数组、符号)、运算符(算术、比较、逻辑、位、赋值)、控制结构(条件语句、循环语句)。 2. **函数**:...

    MySQL中文参考手册

    # 5.4.5.1 不使用外键的理由 + 5.4.6 视图(Views) + 5.4.7 '--'作为一个 注解的开始 o 5.5 MySQL 遵循什么标准? o 5.6 怎样处理没有提交/回卷(COMMIT / ROLLBACK) * 6 MySQL 存取权限系统 o 6.1 权限系统做...

    MYSQL

    5.4.4 存储过程和触发器 5.4.5 外键(Foreign Keys) 5.4.5.1 不使用外键的理由 5.4.6 视图(Views) 5.4.7 '--'作为一个 注解的开始 5.5 MySQL 遵循什么标准? 5.6 怎样处理没有提交/回卷...

Global site tag (gtag.js) - Google Analytics