目录

一:位运算符

1:按位与&

2:按位或|

3:按位取反~

4:按位异或

5:移位

1.左移<<:

2.右移>>:

6:码

1.原码:

2:反码:

3:补码:

二:位运算实战

1:判断奇偶数

2:判断二进制位是1还是0

3:交换两个数的值(不使用第三个变量无加减乘除)

4:找出那个落单的数

附加:力扣题:只出现了一次的数字

5:二进制中1的个数

6:2的幂

7:颠倒二进制位


一:位运算符

1:按位与&

类似与数学里的交集,只有两个数都是1时,按位与的结果才是1,否则是0

例如 : 

2:按位或|

相当于数学里的并集,只有两者中有一个为1,那么它们或的按位或的结果就是1

例如:

3:按位取反~

即0取反后变成1,1取反后变成0

例如:

4:按位异或

相同的数字异或为0,相异的数字异或为1

例如:

5:移位

移位能使程序的运行效率更高,可代替乘除法

1.左移<<:

最左侧不要了,最右侧直接补0;(左移相当于乘法,如左移1位,相当于乘以2的1次方)

2.右移>>:

最右侧不要了,最左侧直接补0;(右移相当于除法,如右移1位,相当于除以2的1次方)

6:码

1.原码:

将这个数字按照正负数的形式翻译成二进制

2:反码:

正数的反码是它本身

负数的反码是(除了符号位不变)其他的位置的是原码取反

3:补码:

正数的补码是它本身

负数的补码是它的反码+1

例如:

    int a = 10;  //整型a是4个字节,32位// 00000000 00000000 00000000 00001010 - 原码// 00000000 00000000 00000000 00001010 - 反码// 00000000 00000000 00000000 00001010 - 补码int b = -10;// 10000000 00000000 00000000 00001010 - 原码// 11111111 11111111 11111111 11110101 - 反码// 11111111 11111111 11111111 11110110 - 补码

在进行位运算时:是以补码的形式进行计算的,输出的结果是补码进一步转换成原码输出的


二:位运算实战

1:判断奇偶数

题目:输入一个数字,判断它是奇数还是偶数,用位运算来实现

解析:我们首先要知道,我们输入的数字是10进制,在计算机中是2进制,那么2进制转10进制是该位数字*2^(n-1)   n表示的是它在第几个位置

比如:

我们发现只有最后有机会去决定正负,因为是1或者0乘2的0次方(也就是1)

如果最后一位是1,那么它就是奇数

如果最后一位是0,那么它就是偶数

现在的问题就转变为:如何知道最后一位是1,还是0?

想想我们之前的位运算符,这就是我们的武器= = :答案是让1去&这个数num

如果是答案是1,那么我们就可以知道,num这个数的第一位就是1

如果答案是0,那么我们就可以知道,num这个数的第一位就是0

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int num = 0;scanf("%d", &num);if ((num & 1) == 1){printf("%d是奇数", num);}else{printf("%d是偶数", num);}return 0;
}

2:判断二进制位是1还是0

题目:给出一个数,让你判断它的某一位是0还是1

比如这里这个数我们定为76,然后我们要判断这个数的第3位是0还是1

思路解析:

其实也还是很简单,我们题目既然要我们求的是第3位,那么我们就只需把这个数字右移2位,然后用1&这个数字就可以了

如果答案是1,那么这个数字的第三位就是1,反之则为0

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int num = 76;int temp = num;int k = 3;num = num >> (k - 1);if ((num & 1) == 1){printf("%d的第%d个位置的数字是1", temp, k);}else{printf("%d的第%d个位置的数字是0", temp, k);}return 0;
}

3:交换两个数的值(不使用第三个变量无加减乘除)

这个方法比较难想,先上答案把

 想不明白的同学将a,b代进去就可以理解了= =

异或就像消消乐,只有偶数倍个数的数字出现都为被消掉


4:找出那个落单的数

一个数组中除了某一个元素中之外,其他的元素都出现了两次,写程序找出这份只出现一次的数字

看到有两次,找一个,马上就要想到异或,直接消消乐

#include<stdio.h>
int main()
{int arr[] = { 1,1,2,3,3,4,4,5,5 };int n = sizeof(arr) / sizeof(arr[0]);int x = 0;for (int i = 0; i < n; i++){x = x ^ arr[i];}printf("%d\n", x);return 0;
}

附加:力扣题:只出现了一次的数字

代码实现:

int singleNumber(int* nums, int numsSize)
{int ret = 0;for (int i = 0; i < numsSize; i++){ret = ret ^ nums[i];}return ret;
}

5:二进制中1的个数

 思路解析:

我们在前面已经知道了如何判断第一个位的数字是1还是0,那么我们只需在一个循环里,一次移动移位,共32次,如果遇到了为1,那么就让计数器++,返回计数器即可

int hammingWeight(uint32_t n)
{int result = 0;for (int i = 1; i <= 32; i++){if (n & 1 == 1){result++;}n >>= 1;}return result;
}

6:2的幂

 思路解析:

先自己用二进制表达一下,2的幂,2^1,2^2,2^3

你会发现它们的共同点是,最高位是1,其余为都是0

这个时候有一个特别神的方法:将n&(n-1),如果为0,则说明n是2的幂,反之不是

画图理解:

但是还得有一个条件约束,就是n>0,因为这个题目条件其实要求的是n为正数的情况= =

bool isPowerOfTwo(int n){return (n>0) && (n&(n-1))==0;
}

一行足以

7:颠倒二进制位

思路解析:

开一个新的数ret,将它+n这个数二进制位的第一个数,并让ret左移1,让n右移1,循环32次,这样就实现了倒转

代码实现:

uint32_t reverseBits(uint32_t n) {uint32_t ret = 0;for (int i = 0; i < 32; i++) {ret <<= 1;ret += (n & 1);n >>= 1;}return ret;
}

位运算符+位运算的应用相关推荐

  1. Java位运算符以及运算优先级

    1. Java中的位运算符 (1) 与&: 对运算符两侧以二进制表达的操作符按位分别进行'与'运算. 操作的规则是:仅当两个操作数都为1时.输出结果才为1.否则为0 例:12 & 5 ...

  2. php位运算符与逻辑运算_位运算符及PHP中位运算的应用笔记

    一.逻辑运算符 正式说位运算符之前,先简单提一下逻辑运算符.分3个角度: 0.数学上 记得高中数学讨论复合命题的时候,使用过基本的逻辑运算符 "非"(¬)."与" ...

  3. Python新手学习基础之运算符——位运算

    位运算符 位运算实际上是把数字看作二进制来进行计算,它的运算法则如下: 结合实例,来看下位运算是如何进行的吧: 位运算在实际应用中用途很广泛,比如我们经常听到的子网掩码,它其实就是和IP地址做了按位与 ...

  4. 【详解】位运算符--正数及负数的位运算

    位运算符的正负数计算,按位与&,按位或|,按位异或^,按位非~,左移<<,右移>>,以及涉及的码制相关知识. 文章目录 一.码制 二.位运算符 1.二元位运算符的运算 ...

  5. linux 脚本中除法运算符,Linux中Shell的算数运算符和位运算符用法笔记

    1.算数运算符 算数运算符主要是加.减.乘.除.余.幂等常见的算术运算,以及加等.减等.乘等.除等.余等复合算术运算. 注意:Shell只支持整数运算,小数部分会舍去.一般情况下算术运行需要个let命 ...

  6. swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)...

    swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...

  7. Linux中Shell的算数运算符和位运算符用法笔记

    1.算数运算符 算数运算符主要是加.减.乘.除.余.幂等常见的算术运算,以及加等.减等.乘等.除等.余等复合算术运算. 注意:Shell只支持整数运算,小数部分会舍去.一般情况下算术运行需要个let命 ...

  8. C++primer 第 4 章 表达式 4.7条件运算符 4.8位运算符 4.9 sizeof运算符 4.10逗号运算符 4.11类型转换 4 . 1 2 运算符优先级表

    4.7条件运算符 条件运算符(?:)允许我们把简单的if else逻辑嵌入到单个表达式当中,条件运算符按照如下形式使用: cond ? expr1 : expr2;其中cond是判断条件的表达式,而e ...

  9. php 按位左移,PHP位运算符

    PHP位运算符 位运算符的基本规则: 1:位运算符都是针对整数的二进制数字形式而进行的. 2:按位与运算基本规则: 规则表: 1&1 => 1 1&0 => 0 0& ...

最新文章

  1. 深入理解 C 语言的函数调用过程
  2. php调用第三方接口代码,PHP接口编程——调用第三方接口获取天气
  3. 基于ESP-IDF环境的ESP32-C3开发之No such file or directory
  4. AJRW错误AA707
  5. wamp5环境配置基础教程
  6. Instagram后端架构
  7. 笔记本手机都能用,轻松实现100W快充,AOHi 100W氮化镓PD 充电器体验
  8. 【小程序】自定义导航栏
  9. 搭建个人网站没有公网IP地址可以吗?
  10. pdf合并在线,大家都在用的工具
  11. 关于苹果手机打开钉钉小程序中处理的日期显示invalid date
  12. 网站判断是否是苹果系统和使用微信浏览器
  13. 手机epub阅读软件
  14. PHP删除字符串中的空格和换行符终极方法
  15. 从蒙牛到小度,跨年晚会中的国民品牌变迁
  16. 成人高等教育本科生学士学位日语水平考试大纲
  17. 生物仿生细胞膜包裹药物|人源肝癌细胞HepG2细胞膜|普鲁士蓝纳米介晶细胞膜|纳米红细胞膜负载丹参酮IIA磺酸钠
  18. GPT系列:GPT1 -> 2 -> 3 -> InstructGPT ->ChatGPT
  19. 【重庆SEO教程】如何诊断一个网站SEO优化的好坏
  20. 无人便利店抢人饭碗?这些“黑科技”将创造百万就业

热门文章

  1. Java Overview
  2. 大数据:Shell的操作(2)
  3. 《阅读的方法》罗振宇||阅读新见解
  4. HTML5代码学习:值得收藏的HTML5代码段
  5. win10系统winkawaks 运行游戏只有声音没有画面该怎么办?
  6. ***腾讯云直播(含微信小程序直播)研究资料汇总-原创
  7. earth power oracle,平行世界 | 他「抛弃」绘画从事摄影,将绘画与摄影结合在一起,创造了电影般的震撼场景,邀请我们与他一起穿越黑暗世界的旅程...
  8. 【Python】random.randint()用法
  9. Vue前端项目部署在tomcat
  10. MySQL数据库(一)——基本介绍