美文网首页
玩玩位运算

玩玩位运算

作者: George_Luofz | 来源:发表于2018-03-16 23:56 被阅读5次

参考博文:位操作基础篇之位操作全面总结
在查看博文时,偶然发现一篇文章,总结计算机中位运算,简单、实用又有趣,遂自己实现一番

基础知识

  1. 6种逻辑操作符
运算符 描述 规则
& 两位相同则为1
| 两位同0才为0,其他为1
^ 异或 两位相同为0,相反为1
~ 取反 0变1,1变0
<< 左移 向左移动若干位,高位丢弃,低位补0
>> 右移 向右移动若干位,无符号数,高位补0;有符号数,高位补符号位(一般情况)

说明:

  1. 位操作只用于整形数据
  2. 位操作优先级较低,如int a = 1 >> i +1,程序会先执行+运算,改为int a = (1 >> i) +1
  1. 原码反码补码
名称 正数 负数
原码 原始数据 原始数据,高位为1
反码 原始数据 原码除符号位外各位取反
补码 原始数据 反码+1

计算机中,负数用补码表示,比如-1原码是1000 0001,计算机中正确的值应为1111 1111,过程为:先反码1111 1110 -> 再+1 -> 1111 1111

实用功能

  1. 判断奇偶
   int a = -10;
   int i = a >> 31;

int 用4个字节,即32位,判断正负,右移31位即可,i的值要么是0,要么是1

  1. 交换两个数
    int a,b;
    a ^ = b;
    b ^ = a;
    a ^ = b;
  1. 第一步:a = (a ^b);
  2. 第二步:b = (b ^ a) = (b ^ (a ^ b)) = b ^ b ^ a = a;此处解释b^b = 0, a ^ 0 则为自身
  3. 第三步:a = (a ^ b) = (a ^ b) ^ a) = a ^ a ^ b = b;将上边两步结果代入即可求得
  1. 变换符号,正数变负数,负数变正数
int a = -10;
a = ~a;
  1. 求绝对值
  • 方案1,先判断符号,若为正,则为自身;若为负,则取反
 int a = -10;
 int i = a >> 31;
 int newI = i == 0 ? a : ~a + 1;
  • 方案二,用异或操作,不用逻辑表达式
 int a = -10;
 int i = a >> 31;
 int newI2 = (a ^ i) - i;

当i = 0时,与0亦或还是自身,再-0数值不变
当i = -1时,与-1亦或就是取反,因为-1就是0x1111 1111,再-i就是+1(此时i = -1)

高阶玩法

就像玩魔方3阶玩够了,玩一下四阶、五阶,最高好像是7阶吧

  1. 统计数组中只出现一次的数字
    题目:在一个数组中除1个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这个数字

分析:由于数组中其他数字都出现了两次,利用异或的特点,两个相同异或得0,与0异或还是自身,将数组所有数据异或一遍即可求得结果

    NSArray *arr = @[@(1),@(2),@(2),@(5),@(5),@(789),@(312),@(312),@(789)];
    int v = 0;
    for(int i = 0 ;i < arr.count; i++){
         v ^= [arr[i] intValue];
    }
    NSLog(@"result:%d",v);

结果:2018-03-17 00:18:58.434719+0800 iOSLearnigDemo[29364:3801045] result:1

此题还有高级版,参见:[数组中只出现1次的两个数字(百度面试题)](http://blog.csdn.net/morewindows/article/details/8214003
//TODO:

  1. 二进制逆序

  2. 统计二进制中1的个数

  3. 高低位交换

相关文章

  • 玩玩位运算

    参考博文:位操作基础篇之位操作全面总结在查看博文时,偶然发现一篇文章,总结计算机中位运算,简单、实用又有趣,遂自己...

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • 位运算及其应用

    内容概要: 位运算基本操作 基于位运算的状态压缩 位运算经典应用 位运算解N皇后问题 位运算 符号描述规则&与1&...

  • 位运算及用位运算实现权限控制

    请自行补习位运算相关知识 位运算 位运算示例 权限控制

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 位运算

    位运算 1. &:按位与 规律:一假则假任何位上的数和1相&得到的结果还是那个数 2. |:按位或 规律:一真则真...

  • 位运算

    https://leetcode.com/problems/gray-code/description/这个位运算...

  • 位运算

    位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能。如果要开发高效率程序,位运算符是必不...

  • 位运算

    1.不用加减乘除做加法 解法:分为三步①各位相加不进位,即先按位异或;②做进位,按位与并左移位;③结果相加,直至没...

网友评论

      本文标题:玩玩位运算

      本文链接:https://www.haomeiwen.com/subject/ecwpfftx.html