位运算

位运算 - 二进制快速转十进制

廉价感情. 提交于 2020-01-26 04:37:12
二进制 如果你是搞网络的,我觉得你一定要记住以下几种二进制数的转换值。 你是一个网络工程 师,当看到一串二进制数时,你不要告诉我你会拿出笔纸或掰手指算半天才知道它转化成十进制的数值。 要想快,那就记下下面几种常见的二进制 -- 十进制转换: 以 8 位 来演示 : 1. 第一种 : 0000 0001 1 0000 0010 2 0000 0100 4 0000 1000 8 0001 0000 16 0010 0000 32 0100 0000 64 1000 0000 128 2. 第二种: 0000 0001 1 0000 0011 3 0000 0111 7 0000 1111 15 0001 1111 31 0011 1111 63 0111 1111 127 3. 第三种: 1000 0000 128 1100 0000 192 1110 0000 224 1111 0000 240 1111 1000 248 1111 1100 252 1111 1110 254 举个例子: 1110 1011 可分为: 1110 0000 (上面第三种类型) 224 0000 1000 (上面第一种类型) 8 0000 0011 (上面第二种类型) 3 我们通过记住上面三种类型的转换,再用加 法(加法口算你会吧)立即得到结果: 235 === === === === === ===

1.位运算----题3 二进制中一的个数

放肆的年华 提交于 2020-01-25 07:04:22
1.原数字不动,1左移,如果将1左移i位与N与后,与1左移后相等,证明i位为1。 package 位运算; import java.util.Scanner; public class numberofone { public static void main(String[] args) { Scanner sc=new Scanner(System.in);//Scanner类可以扫描字符串和基本类型数据进行分析,正则表达式 int N=sc.nextInt();//scanner类的方法用来读取INT型数据 System.out.println(Integer.toBinaryString(N));//输出N的二进制形式 int count=0; for(int i=0;i<32;i++) { if((N& (1<<i))==(1<<i))//将1左移i位与N与后,与1左移后相等,证明i位为1 {count++;} } System.out.println(count); } } 2.数字右移,最后一位与1与运算,与后结果为1,则i位为1。 package 位运算; import java.util.Scanner; public class numberofone { public static void main(String[] args) { Scanner sc

leetcode-位运算

吃可爱长大的小学妹 提交于 2020-01-25 03:41:09
位运算 文章目录 位运算 LeetCode 231. Power of Two LeetCode 762. Prime Number of Set Bits in Binary Representation LeetCode 136. Single Number LeetCode 476. Number Complement LeetCode 137. Single Number II LeetCode 260. Single Number III LeetCode 371. Sum of Two Integers LeetCode 201. Bitwise AND of Numbers Range LeetCode 477. Total Hamming Distance LeetCode 421. Maximum XOR of Two Numbers in an Array LeetCode 231. Power of Two class Solution { public : bool isPowerOfTwo ( int n ) { return n > 0 && ( 1 << 30 ) % n == 0 ; //return (n>0 && (n & -n) == n); } } ; //lowbit,取出n二进制中第一个1的位置k /* lowbit(n) = n & (

异或算法

橙三吉。 提交于 2020-01-24 02:49:00
最近碰到很多通过巧妙着运用 位运算 来巧妙解决复杂问题的算法,今天分享的这道题,或许能够开拓你的一些算法思维。 题目描述 有一组存放 ID 的数据。并且 ID 取值为 0 - (N-1) 之间,其中只有一个 ID 出现的次数为 1,其他的 ID 出现的次数都等于 2,问如何找到这个次数为 1 的 ID ? 解法一:巧用数组下标 不知道有多少人还记得我之前分享的 巧用数组下标 的技巧: 一些常用的算法技巧总结 。 我的第一想法便是采用 下标法 来解决,把 ID 作为数组 arr 的下标,在遍历 ID 的过程中,用数组记下每个 ID 出现的次数,即每次遍历到 ID = n,则 arr[n]++。 之后我们在遍历数组 arr,找到 arr[n] = 1 的ID,该下标 n 便是我们要寻找的目的 ID。 这种方法的时间复杂度为 O(N),空间复杂度为 O(N)。 解法二:巧用哈希表 显然时间复杂度是无法再降低的了,因为我们必须要遍历所有的 ID,所以时间复杂度最少都得为 O(N)了,所以我们要想办法降低空间复杂度。 大家想一个问题,假如我们检测到某个 ID 已经出现了 2 次了,那么这个 ID 的数据我们还需要存储记录吗?大部分的 ID 都出现了 2 次,这一大部分的数据真的需要存储吗? 答是不用的,因为出现 2 次的 ID 不是我们所要找的。所以我们可以优化 解法一 ,我们可以采用

位运算

谁都会走 提交于 2020-01-21 00:06:27
符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ^ 异或 两个位相同为0,相异为1 ~ 取反 0变1,1变0 << 左移 各二进位全部左移若干位,高位丢弃,低位补0 >> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) 来源: CSDN 作者: wangfy_ 链接: https://blog.csdn.net/chushoufengli/article/details/104056013

位运算的简单应用-权限管理

我怕爱的太早我们不能终老 提交于 2020-01-17 00:30:37
个人博客 http://www.milovetingting.cn 位运算的简单应用-权限管理 位运算在实际的开发中,有很多巧妙的应用场景。如: 一个存放正整数的数组,里面有一个数字只出现一次,其它数字都出现两次,求只出现一次的数字。 不用临时变量,交换两个数字的值。 Android中Window设置Flag public void setFlags(int flags, int mask) { final WindowManager.LayoutParams attrs = getAttributes(); attrs.flags = (attrs.flags&~mask) | (flags&mask); mForcedWindowFlags |= mask; dispatchWindowAttributesChanged(attrs); } 产品具有某些Feature,这些Feature可以利用位运算来存储。 下面利用位运算来简单模拟权限管理 权限管理类 public class PermissionManager { public static final int PERMISSION_NONE = 1; public static final int PERMISSION_A = 1 << 1; public static final int PERMISSION_B =

[不会]位运算不懂例子

我的梦境 提交于 2020-01-16 13:23:24
1 #include<iostream> 2 using namespace std; 3 int main() { 4 int a,b; 5 int n; 6 while(cin >> n) { 7 cin >> a; 8 for(int i=1;i<n;i++) { 9 cin >> b; 10 a^=b; 11 } 12 cout << a << endl; 13 } 14 return 0; 15 } 二进制的遍历: 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a[5] = {1,3,5,6,8}; 6 int n; 7 n = 5; 8 for(int i = 0;i < (1 << n); i++) {//从0~2^n-1个状态,遍历每一个集合 9 for(int j = 0; j < n; j++) { //遍历二进制的每一位 10 if(i & (1 << j)){ //判断二进制第j位是否存在 11 cout << a[j] << ' '; 12 } 13 } 14 cout << endl; 15 } 16 return 0; 17 } 来源: https://www.cnblogs.com/waryan/p/12200598.html

一些有趣有用的位运算

帅比萌擦擦* 提交于 2020-01-14 03:26:18
本文分两部分,第一部分列举几个有趣的位操作,第二部分讲解算法中常用的 n & (n - 1)操作,顺便把用到的这个技巧的算法题列出来讲解一下,因为位操作很简单,所以假设读者已经了解与、或、异或这三种基本操作。 位操作(Bit Manipulation)可以玩出很多奇淫技巧,但是这些技巧大部分都过于晦涩,没必要深究,读者只要记住一些有用的操作即可。 一、几个有趣的位操作 1 . 利用或操作 | 和空格将英文字符转换为小写 ('a' | ' ') = 'a' ('A' | ' ') = 'a' 2 . 利用与操作 & 和下划线将英文字符转换为大写 ('b' & '_') = 'B' ('B' & '_') = 'B' 3 . 利用异或操作 ^ 和空格进行英文字符大小写互换 ('d' ^ ' ') = 'D' ('D' ^ ' ') = 'd' PS:以上操作能够产生奇特效果的原因在于 ASCII 编码。字符其实就是数字,恰巧这些字符对应的数字通过位运算就能得到正确的结果,有兴趣的读者可以查 ASCII 码表自己算算,本文就不展开讲了。 4 . 判断两个整数是否异号 int x = -1, y = 2; bool f = ((x ^ y) < 0); // true int x = 3, y = 2; bool f = ((x ^ y) < 0); // false PS

位运算常见操作和农夫过河问题(C++实现)

点点圈 提交于 2020-01-13 17:11:37
文章目录 二进制常见操作 二进制数中 1 的个数 解法 1 解法 2 判断二进制数某一位为 1 还是 0 反转二进制数某一位 进制操作的一些实用规律 综合例题 —— 农夫过河问题 二进制常见操作 二进制数中 1 的个数 解法 1 用 n & 1 判断最右边一位是否为 1,右移之后继续判断最右边一位,重复直到 n = 0。时间复杂度为 O(log2n) # include <iostream> using namespace std ; int main ( ) { int n = 0 b1101 , cnt = 0 ; while ( n ) { cnt + = n & 1 ; n >>= 1 ; } cout << cnt << endl ; return 0 ; } 解法 2 用 n & (n - 1) 可以消去最右边的 1,重复直到 n = 0。时间复杂度为 O(count) ,取决于 1 的个数 count,所以这种方法优于第一种。 # include <iostream> using namespace std ; int main ( ) { int n = 0 b1101 , cnt = 0 ; while ( n ) { n = n & ( n - 1 ) ; ++ cnt ; } cout << cnt << endl ; return 0 ; }

位运算的威力

孤街醉人 提交于 2020-01-13 13:27:24
转自: http://blog.csdn.net/iukey/article/details/7195265 一、有关位运算的基础知识总结 位运算包括:&(与)、|(或)、^(异或)、~(取反)、>>(右移)、<<(左移) 环境预设:32位机下面,int占2个字节,有符号 int a = 11; int b = 1000; (a) 2 = (00000000 00001011 ) 2 //a的二进制表示 (b) 2 = (00000011 11101000 ) 2 //b 的二进制表示 a&b = (00000000 00001000 ) 2 =(8) 10 //一一为一,其它为0 a|b = (00000011 11101011 ) 2 =(1003) 10 //有一为一,零零为0 a^b = (00000011 11100011 ) 2 =(995) 10 //相同为0,不相同为1 ~b = (11111100 00010111 ) 2 = (-31767) 10 //按位取反 b>>3 = (00000000 01111101 ) 2 = (125) 10 // 去掉低3位,高位补0 或 = (11100000 01111101 ) 2 = (-24701) 10 // 去掉低3位, 高位补1 补0还是1具体情况视编译环境决定 a<<3 = ( 00000000