上一篇中我们分析了位的定义,这一篇中我们分析一下位的基本运算1. 移动左移n位:乘以2的n次方右移n位:除以2的n次方(~0)左移n位:在1后面加上n个0 (注:~0不等于1。等于11…11)x&(~0<<n):将最右边的n位清零正数左移右边补0正数右移左边补0负数左移右边补1负数右移左边补1移动的作用总结:乘2,除2。右n位清零2. 异或x^0=xx^x=0x^1=~xx^~x=1异或的作用总结:取数,清零,取非,清13. 且运算x&0=0x&1=xx&x=x且运算的作用总结:...
include <bits/stdc++.h>using namespace std;
int n;
int x[200005], y[200005], xr[200005];
int main() {
int t;
cin >> t;
while(t--) {
cin >> n;
for(int i = 1; i <= n; i++) cin >> x[i];
for(int i = 1; i <= n; i++) {
int tmp = 0;
if(i == 1) {
y[1] = 0;
xr[1] = 0 ^ x[1];
continue;
}
int fuck = 0;
for(int j = 0; j < 32; j++) {//逐位分析
fuck |= (((xr[i - 1] >> j) & 1) << j);
if((xr[i - 1] >> j) & 1) {//...
n&(n-1)
作用是消除数字的二进制表示中的最后一个1左移和右移 >>> >> <<< <<
左移乘2
右移除2n&1 == 1
用来判断n的二进制最后一位是不是1,是1则true,是0则false
也就是可以用来判断n的奇偶性
所以,!(n&1) == 1可以用来判断是否为0
文章目录
题目解答题目链接题目解答分析:位运算,快速幂的思想
/*
a * b
a + a + a + a + a ... + a 共b个aa * 1 = a
a * 2 = 2a
a * 4 = 2a + 2a
a * 8 = 4a + 4a
...
a * (2^k) = 2^k * a时间复杂度是logb级别的
*/ac代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;int main(){LL a, b, p;cin >> a >> b >> p;LL res = 0;while(b){if(b & 1) res = (res + a) % p;b >>= 1;a = a * 2 % p;}cout << ...
今天来盘一盘 **位运算 ** 这类题目
使用python刷题分类整理的笔记,请参考: https://github.com/lxztju/leetcode-algorithm/tree/v1
位运算
461 汉明距离 (Easy)136 只出现一次的数字 (Easy)268 丢失的数字 (Easy)260 只出现一次的数字 III (Medium)190 颠倒二进制位 (Easy)231 2的幂 (Easy)342 4的幂 (Easy)693 交替位二进制数 (Easy)476 数字的补数 (Easy)371 两整数之和 (Easy)318 最大单词长度乘积 (Medium)338 比特位计数 (Me...
位运算面试题
191. Number of 1 Bitspublic class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int res=0;while(n!=0){n=n&(n-1);res++;}return res;}
}231. Power of Two
class Solution {public boolean isPowerOfTwo(int n) {if(n>0 && (n & (n-1))==0 ){return true;}return false;}
}注意:1000 0000 .。。。 JAVA中是有符号数
338. Counting Bitsclass Solution {public int[...
// 只出现一次的数字
func singleNumber(nums []int) int {num := 0for _, v := range nums {num ^= v}return num
}// 二进制中1的个数
func hammingWeight(num uint32) int {sum := 0for ; num > 0; num >>= 1 {if num & 1 == 1 {sum++}}return sum
}// 两数相加(不使用加减乘除)
func twoSum(a, b int) int {for b != 0 {a, b = a^b, a&b<<1}return a
}// 交换两个整数a,b值
func Exchange(a, b int32) (int32, int32) {a = a ^...
位运算原理位运算原理
基本位运算
x ^ 0s = x x & 0s = 0 x | 0s = x
x ^ 1s = ~x x & 1s = x x | 1s = 1s
x ^ x = 0 x & x = x x | x = x感觉这得记住
去除两个相同的数
利用 x ^ x = 0
掩码操作
利用 x & 0s = 0 和x & 1s = x 可以实现掩码操作,例如 x & 0b0011100 仅保留x中与 1 重叠的部分
设值操作
利用 x | 1s = 1s 和 x | 0s = x 可实现设值操作,例如 x | 0b0011100 把x中与右边 1 相对应...
位运算在算法题中的应用
上篇博客总结的位运算的基础和基本的使用,这篇博客总结一下位运算在一些算法题中的使用
上篇博客:位运算基础及基本应用
题1
数组1-1000中(1001个数),有唯一一个重复的数,其他数只出现一次,求唯一一个重复的数。
要求:数组元素只能访问一次,不使用辅助空间
解题思路
利用位运算的异或性质解题a ^ b ^ b = a ^ 0 = a。原数组1-1000并且有一个重复的数(数组长度1001),与数组1-1000进行所有元素异或...
目录Java中的位运算及简单的算法应用介绍
众所周知,计算机底层是二进制。而java作为一门计算机编程语言,也对二进制的位运算提供了完整的支持。在java中,int是32位的,也就是说可以用来实现32位的位运算。方便起见,我们一般用16进制对它赋值,比如: 0011表示成16进制是 0x3, 110111表示成16进制是 0x37。那么什么是位运算呢?位运算是将数据看做二进制,进行位级别的操作。主要有移位运算和逻辑运算
移位运算左移:操作符为<<,...
快速幂的实现
洛谷P1226
题目描述输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。输入格式三个整数b,p,k.输出格式输出“b^p mod k=s”
s为运算结果输入输出样例输入 #1
2 10 9
输出 #1
2^10 mod 9=7
?
一道位运算入门经典题,几乎所有讲算法的书籍都有所提及,此处就依照李煜东《算法进阶指南》书中指导进行讲解(实际上,理解以后没啥好讲的)
?
考虑如下:
对于正整数b,一定可以唯一表示为若干指数不重复的2的次幂...
幂运算:
x^n,
暴力法:自己乘自己,乘n遍
快速幂的运算,x^n = x^0.5n * x^0.5n 所以,求出x^0.5n,再对自己运算一次,就能得出答案,节省了很多的运算量。
算法的核心,就是x^n 当n为偶数的时候,执行上面写的转换,当n为奇数的时候,就可以执行x^n = x^(n - 1) * x;,就可以继续递归执行(n-1的偶数)的运算了
注意:n是负数的时候,让x = 1/x,然后n就可以变成正数进行运算
递归算法:var myPow = function (x, n) {// consol...
位运算符是作用于整数的运算对象,把运算对象看成二进制的集合。运算符
功能
用法~
按位求反
~expr<<
按位左移
expr1 << expr2>>
按位右移
expr1 >> expr2&
按位与
expr1 & expr2^
按位异或
expr1 ^ expr2|
按位或
expr1 | expr2按位求反(~)将运算对象的二进制逐位求反,将1置为0,将0置为1,后得到一个新的值。int j = 10;
cout << (~j) << endl;//-11按位左移(<<)将运算对象的二进制位往左移动n位,右边以数字0补充空出来的二进...