首页 > 其他分享 >位运算随笔

位运算随笔

时间:2022-12-27 20:47:50浏览次数:29  
标签:运算 二进制 异或 按位 操作 随笔 数位

位运算常用运算

1、左移操作 <<

左移操作可以将二进制数a的每个数位均进行左移,并在移动后右边空出来的数位补0。

例如:a << b意为将二进制数a左移b个数位,在右边空出数位补0。假设a=101,b=1,则将二进制数a左移1位,右边空出来的数位补0,所以新数为1010,同理,a=101,b=2时的新数为10100,依次类推。

需要注意的是,二进制数左移n位等于对应的十进制数 * 2n。例如二进制数101对应的十进制数是5,则将101左移2位后得到的二进制数10100对应的十进制数为5*2 2=20。

2、右移操作 >>

与左移操作类似,右移操作可以将二进制数a的每个数位均进行右移,忽略移动后的小数数位。

例如:a >> b意为将二进制数a右移b个数位,将小数部分(移动前的后b位)删去。假设a=10101,b=2,则移动后的新数为101。

同上,二进制数右移n为等于对应的十进制数/2^n(下取整)。

3、按位与操作 &

按位与操作会将两个二进制数的数位对齐(数位少的高位补0),之后对每一位依次进行与操作。

例如:a=111(补0后为00111),b=11110,则a&b的结果为00110。

&运算可以用来取一个数对应的二进制数的最末位,例如a&1即为a对应二进制数的最末位。二进制数最末位为0则该数为偶数,为1则为奇数。

4、按位或操作 |

与按位与操作相同,按位或操作会将两个二进制数的数位对齐,之后对每一位依次进行或操作。

|运算常用作对某数对应的二进制数的某一位无条件赋值,例如a|1即将a对应二进制数的最末位赋值为1。

5、按位非操作 ~

按位非操作可以将二进制数的每一位进行非(取反)操作。

如果该数为无符号整数类,该操作会将数字后面所有的0均变为1,如果该数为有符号整数类,那么计算机会按照补码的法则对得到的反码继续进行运算

6、按位异或操作 ^

按位异或操作会将两个二进制数的数位对齐,之后对每一位进行如下规则的操作:

如果两数该数位上的数相同(同为0或1),则得到的新数的该数位为0,否则新数该数位为1。

例如:a=00101,b=11100,则a^b的结果为11001。

按位异或操作的逆运算是它本身,也就是说ab=c,则cb=a。

由于某数的一个数位0的结果不变,1的结果取反,在程序中,位运算常用来对一个数对应的二进制数的某一位进行取反,例如a1即将a的最末位进行取反,a10即将a的倒数第二位进行取反。

位运算实用杀招

若当前二进制位为S,对S有下列操作。

①判断第i位是否为0:(S&(1<<i)==0,意思是将1左移i位与S进行与运算后,看结果是否为0

②将第i位设置为1:S|(1<<i),意思是将1左移i位与S进行或运算。

③将第i位设置为0:S&~(1<<i),意思是S与第i位为0,其余位为1的数进行与运算。

例如:S=1010101,i=5。注意二进制位从0开始计数,所以i=5实际上是第6位
S&(1<<i):1010101&0100000=000000
image

常用操作

1.快速求2^n

1<<n == pow(2,n)

原理:1<<n的意思是1的二进制向左移动n位,则此数二进制形式变成了 100000...000(n个0),恰好是2^n

2.判断奇数偶数

n&1 == 1则为奇数

n&1 == 0则为偶数

原理:n&1的意思是n与1,那么n与1中,1除了右端位为1其他位都是0,则由与运算得到的结果中其他位必定都是0 。

所以最后得到的结果只与1的右端位和n的右端位有关,我们知道1的右端位为1,那么n的右端位只有为1的时候与1进行与运算的结果是1;n的右端位只有为0的时候与1进行与运算的结果是0 。

显然二进制右端位为1的时候该数为奇数,为0时该数为偶数,所以得证。

3.lowbit

a&(-a) 代表着a的二进制的最后一位。

原理:涉及到二进制的补码知识,感兴趣的人可以自己了解。

三、高阶操作

1.a >> b & 1 代表着如果a的第b位为1则为真

用来判断二进制的某一位

原理:a左移b位,则a的右端位就是原来a的第b位,这时与1做与运算(1左边的0由与运算性质得没有影响)就可以得知这一位是1还是0(1&1 == 1,0|1 == 0 )

2.a|(1<<n) 代表着将a的二进制的第n位设为1

原理:1<<n可以看作由一个1和n个0组成的二进制数,其中0的部分由或的性质(0|00,1|01)可以知道不会对二进制位产生影响。

而1的部分由或的性质(1|1==1,0|1=1)可以得出一定是1。

例题解析

image

一个比较简单的思路,对数组排序,然后逐个统计每个数字出现的次数,复杂度O(nlogn) 。
位运算异或^: 根据 XOR运算的性质,a ^ a=0 。如果某个数出现了两次,那么他们 异或在一起的值恰好为0。
进一步扩展,出现偶数次的数异或和也一定为0,出现奇数次的数异或和一定是这个数本身。因此只要将所有数异或 在一起,剩下的那个数就是出现奇数次的数。

#include<bits/stdc++.h> 
using namespace std;
int n;
int main()
{
	int x;
	while (~scanf("%d", &n)) 
	{ 
		int ans = 0;
		for (int i = 0; i < n; i++) 
		{ 	
			scanf("%d", &x);
			ans ^= x;
		}
	printf("%d\n", ans);
	}
	return 0;
}



[oi-wiki](https://oi-wiki.org/math/bit/ "oi-wiki")

标签:运算,二进制,异或,按位,操作,随笔,数位
From: https://www.cnblogs.com/onginer/p/17008944.html

相关文章

  • c/c++ 大小写转换(位运算)
    #include<iostream>//大写转小写小写转大写staticcharUpperOrLower(charch){return(ch^0x20);}//转大写staticcharToUpper(charch){ret......
  • OpenCV-Python learning-7.运算性能
    本节说明opencv-python对于性能的度量和优化。以下为代码部分:%matplotlibinlineimportcv2importmatplotlib.pyplotaspltimg=cv2.imread('e:/rotman.jpg')plt.imshow(......
  • ios 逆向 随笔
    使用爱思助手打开ssh通道登入ssh-p2222root@localhostalpine注:如无法连接,可直接删除.ssh目录user/用户/.ssh(rm-rf.ssh)使用frida-ios-dump-master目录中的dump.py脚......
  • 随笔文,关于”中台“的一些小偏论
    今儿个这篇随笔没有核心思想内容随意表达,想到哪里写到那些。 昨儿个一个好久不联系的朋友忽然微信“你的公众号一段时间不更新了”, 我回复“这不是在码字,做总结吗”,不......
  • JS手写练习随笔-20221226.2 ---- 带并发限制的异步调度器
    最多保持特定数量任务执行的异步调度器classScheduler{//最大任务执行数目privatemaxCnt:number;//正在执行的任务数目privaterunningCnt:number;......
  • 计算机组成原理——计算机的运算方法
    计算机应用领域极其广泛,但不论其应用在什么地方,信息在机器内部的形式都是一样的,即均为0、1组成的各种编码一.内容概述二.计算机中参与运算的数计算机中的数均放在寄存器中......
  • 新增随笔主题-阅读笔记
    看书,专业书,自学,从《深入理解计算机系统》开始,但是这本书目前不在身边,所以只好从《操作系统导论》开始主要是感觉有点闲了,或者换个说法,能自由支配的时间很多,找工作暂时也不......
  • 高精度运算
    高精度运算众所周知,c++有一种变量叫int_64……谁还用高精度呢好吧NOI与CSP貌似不支持int_64的样子完结撒花高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超......
  • JS手写题随笔-20221226.1 ---- 数组打平
    1.借助reduce递归functionflat(arr){if(!Array.isArray(arr)||arr.length===0){return[];}returnarr.reduce((pre,cur)=>{......
  • ES6三点运算符
    三点运算符,展开并合并数组   ......