玩玩位运算

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

基础知识

  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. 高低位交换

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容

  • 1、常量与变量 程序执行中值不会变化的为常量,会变化的为变量。如定义一个常量PI,表示圆周率,圆周率不会改变;定义...
    元富阅读 532评论 0 0
  • 网站乱码问题我们会经常碰到,大多见于非英文的中文字符或其他字符乱码,而且,这类问题常常是因为编码方式问题,主要原因...
    波段顶底阅读 2,698评论 1 9
  • 一、概要 1、数据的表示:数制及其转换、原码、反码、补码、移码、浮点数、溢出、算...
    _Jason___阅读 2,967评论 0 5
  • 概述 在学习位运算之前,先说下几个概念: 机器数:一个数字在计算机中的二进制表达形式就叫做机器数。机器数是有符号位...
    骑着乌龟去看海阅读 2,404评论 1 4
  • 1.编译程序 (1)gcc xx.c,他会默认生成一个a.out的可执行文件,在a.out所在目录,执行./a....
    萌面大叔2阅读 411评论 0 1