位运算符+位运算的应用
目录
一:位运算符
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;
}
位运算符+位运算的应用相关推荐
- Java位运算符以及运算优先级
1. Java中的位运算符 (1) 与&: 对运算符两侧以二进制表达的操作符按位分别进行'与'运算. 操作的规则是:仅当两个操作数都为1时.输出结果才为1.否则为0 例:12 & 5 ...
- php位运算符与逻辑运算_位运算符及PHP中位运算的应用笔记
一.逻辑运算符 正式说位运算符之前,先简单提一下逻辑运算符.分3个角度: 0.数学上 记得高中数学讨论复合命题的时候,使用过基本的逻辑运算符 "非"(¬)."与" ...
- Python新手学习基础之运算符——位运算
位运算符 位运算实际上是把数字看作二进制来进行计算,它的运算法则如下: 结合实例,来看下位运算是如何进行的吧: 位运算在实际应用中用途很广泛,比如我们经常听到的子网掩码,它其实就是和IP地址做了按位与 ...
- 【详解】位运算符--正数及负数的位运算
位运算符的正负数计算,按位与&,按位或|,按位异或^,按位非~,左移<<,右移>>,以及涉及的码制相关知识. 文章目录 一.码制 二.位运算符 1.二元位运算符的运算 ...
- linux 脚本中除法运算符,Linux中Shell的算数运算符和位运算符用法笔记
1.算数运算符 算数运算符主要是加.减.乘.除.余.幂等常见的算术运算,以及加等.减等.乘等.除等.余等复合算术运算. 注意:Shell只支持整数运算,小数部分会舍去.一般情况下算术运行需要个let命 ...
- swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)...
swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...
- Linux中Shell的算数运算符和位运算符用法笔记
1.算数运算符 算数运算符主要是加.减.乘.除.余.幂等常见的算术运算,以及加等.减等.乘等.除等.余等复合算术运算. 注意:Shell只支持整数运算,小数部分会舍去.一般情况下算术运行需要个let命 ...
- 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 ...
- php 按位左移,PHP位运算符
PHP位运算符 位运算符的基本规则: 1:位运算符都是针对整数的二进制数字形式而进行的. 2:按位与运算基本规则: 规则表: 1&1 => 1 1&0 => 0 0& ...
最新文章
- 深入理解 C 语言的函数调用过程
- php调用第三方接口代码,PHP接口编程——调用第三方接口获取天气
- 基于ESP-IDF环境的ESP32-C3开发之No such file or directory
- AJRW错误AA707
- wamp5环境配置基础教程
- Instagram后端架构
- 笔记本手机都能用,轻松实现100W快充,AOHi 100W氮化镓PD 充电器体验
- 【小程序】自定义导航栏
- 搭建个人网站没有公网IP地址可以吗?
- pdf合并在线,大家都在用的工具
- 关于苹果手机打开钉钉小程序中处理的日期显示invalid date
- 网站判断是否是苹果系统和使用微信浏览器
- 手机epub阅读软件
- PHP删除字符串中的空格和换行符终极方法
- 从蒙牛到小度,跨年晚会中的国民品牌变迁
- 成人高等教育本科生学士学位日语水平考试大纲
- 生物仿生细胞膜包裹药物|人源肝癌细胞HepG2细胞膜|普鲁士蓝纳米介晶细胞膜|纳米红细胞膜负载丹参酮IIA磺酸钠
- GPT系列:GPT1 -> 2 -> 3 -> InstructGPT ->ChatGPT
- 【重庆SEO教程】如何诊断一个网站SEO优化的好坏
- 无人便利店抢人饭碗?这些“黑科技”将创造百万就业
热门文章
- Java Overview
- 大数据:Shell的操作(2)
- 《阅读的方法》罗振宇||阅读新见解
- HTML5代码学习:值得收藏的HTML5代码段
- win10系统winkawaks 运行游戏只有声音没有画面该怎么办?
- ***腾讯云直播(含微信小程序直播)研究资料汇总-原创
- earth power oracle,平行世界 | 他「抛弃」绘画从事摄影,将绘画与摄影结合在一起,创造了电影般的震撼场景,邀请我们与他一起穿越黑暗世界的旅程...
- 【Python】random.randint()用法
- Vue前端项目部署在tomcat
- MySQL数据库(一)——基本介绍