位运算

一张表了解位运算

大城市里の小女人 提交于 2019-12-18 00:52:36
位运算 什么是“位运算”,百度百科是这样解释的:程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。 我的理解是他跟咱们普通运算基本一样,不一样的地方就是,位运算是基于二进制,有自己的一些特殊的运算符,计算机对二进制数据进行的运算都是叫位运算,即将符号位共同参与运算的运算。在这里简单介绍一下它的运算符,和运算规则。 来源: CSDN 作者: 牧牛童 链接: https://blog.csdn.net/weixin_43263416/article/details/103585663

模板||快速幂

醉酒当歌 提交于 2019-12-17 02:23:29
有那么一种算法可以让计算a^b变得更快,那就是 快速幂 。如果直接暴力计算的话需要计算b次。时间蛮长的。 题目描述:   输入a,b.(a,b为整数)计算a^b。 输入输出格式 输入格式: 两个整数a、b。. 输出格式: 输出“a^b=s” s为运算结果 前提:你需要了解二进制,十进制。位运算的知识(当然也可以没有,万事皆可模拟。) 没有位运算的: #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<iomanip> #include<queue> #include<cmath> using namespace std; char e[10001]; int cd; long long quickpow(long long a,char b[]) { long long ans=1,base=a; while(cd!=-1) { if(int(b[cd])!=0) ans*=base;//最后一位是1的话。 base*=base; cd--;//抹去最后一位。 } return ans; } void zh(long long a) { char zs[10001]; int sum=0; while(a!=0) { zs[sum]=a

PHP: 详解ip2long和long2ip

戏子无情 提交于 2019-12-14 11:45:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在开发中,经常需要将IP地址转成整型进行保存,这样不仅有利于做索引,并且原本需要15个字节的存储空间,转换后只需4个字节就能存储了。但是很多人对于ip2long的结果有时候是负数并不理解,本文将详细解释这一点。因为ip2long只支持IPv4,所以本文也是基于IPv4来描述和编码的。 右移 逻辑右移 右移多少位,则在高位补多少位0。 算术右移 对无符号数做算术右移和逻辑右移的结果是相同的。但是对一个有符号数做算术右移,则右移多少位,即在高位补多少位1。 注意事项 对于C来说,只提供了>>右移运算符,究竟是逻辑右移还是算术右移这取决于编译器的行为,因此一般只提倡对无符号数进行位操作。 IPv4地址是如何表示的 IPv4使用无符号32位地址,因此最多有2的32次方减1(4294967295)个地址。一般的书写法为用4个小数点分开的十进制数,记为:A.B.C.D,比如:157.23.56.90。 IPv4地址转换成无符号整型 IPv4地址的每一个十进制数都为无符号的字节,因此范围在0~255,将IPv4地址转成无符号整型其实就是将每个十进制数放在对应的8位上组成一个4字节的无符号整型。依上图表示:157在高8位,90在低8位,23和56在中间对应的8位上。来看一个C实现的例子: #include <stdio.h>

【LeetCode】231. 2的幂 位运算

主宰稳场 提交于 2019-12-14 09:08:04
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 1: 输入: 1 输出: true 解释: 20 = 1 示例 2: 输入: 16 输出: true 解释: 24 = 16 示例 3: 输入: 218 输出: false 在真实的面试中遇到过这道题? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/power-of-two 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 有魔性的几道题目~ class Solution { public: bool isPowerOfTwo(int n) { return n>0 && (n&(n-1))==0; } }; 来源: CSDN 作者: 韩旭051 链接: https://blog.csdn.net/shiliang97/article/details/103517921

java第二期:位运算

送分小仙女□ 提交于 2019-12-11 00:37:51
一、位运算的介绍 位运算:又称是二进制运算,位(代表的是二进制,或者是bit位)1字节 = 8bit(位)。 连接的操作数:其实也是二进制,返回值是一个数据类型。 存储格式:二进制数存储在计算中都是以补码的形式进行存储的。 原码 --> 反码 --> 补码 --------1--------- 2 步奏1:反码 = 0和1的替换 步奏2:补码 = 在反码的前提下+1 原码 <-- 反码 <-- 补码 -------- 2--------- 1 步奏1:反码 = 补码-1 步奏2:原码 = 反码的0、1替换 下面有步奏案例 关于3种状态码的认知在第六标题处,可往下观看。 二、位运算符的使用(bit的补码形式) 介绍运算符: | & ^ :双目运算符,操作数有两个 ~ : 单目运算符,操作数只有一个 3 和 4 的一个按位运算,底层转换为二进制数进行一个运算 3的二进制数:0b0000000000 00000000000 000000000 11 4的二进制数:0b0000000000 00000000000 000000001 00 因为一个int = 4byte 1byte = 8bit 所以将int转二进制数为 32bit(位) 1、按位与 & 规则:在二进制数位上只有相同1的时候才为true 0 1 1 1 0 0 上下都不同,所有结果为 0 0 0 3 & 4 =

IO并发编程及二进制位运算

﹥>﹥吖頭↗ 提交于 2019-12-10 23:56:01
IO 分类 IO分类:阻塞IO ,非阻塞IO,IO多路复用,异步IO等 阻塞IO 1.定义:在执行IO操作时如果执行条件不满足则阻塞。阻塞IO是IO的默认形态。 2.效率:阻塞IO是效率很低的一种IO。但是由于逻辑简单所以是默认IO行为。 3.阻塞情况: 因为某种执行条件没有满足造成的函数阻塞 e.g. accept input recv 处理IO的时间较长产生的阻塞状态 e.g. 网络传输,大文件读写 非阻塞IO 代码实现: day9/block_io 定义 :通过修改IO属性行为,使原本阻塞的IO变为非阻塞的状态。 设置套接字为非阻塞IO sockfd.setblocking(bool) 功能:设置套接字为非阻塞IO 参数:默认为True,表示套接字IO阻塞;设置为False则套接字IO变为非阻塞 超时检测 :设置一个最长阻塞时间,超过该时间后则不再阻塞等待。 sockfd.settimeout(sec) 功能:设置套接字的超时时间 参数:设置的时间 IO多路复用 定义 同时监控多个IO事件,当哪个IO事件准备就绪就执行哪个IO事件。以此形成可以同时处理多个IO的行为,避免一个IO阻塞造成其他IO均无法执行,提高了IO执行效率。 具体方案 select方法 : windows linux unix poll方法: linux unix epoll方法: linux select

凶悍的位运算

随声附和 提交于 2019-12-10 01:22:54
凶悍的位运算 补上篇文章的坑,今天就来介绍下位运算。 一,位运算的意义 虽然网上搜到不少大佬的介绍,但问题是,萌新不太懂啊,只能自己从自己学到的出发,以后遇到了继续添加。 1.较高的执行效率 2.较低的空间需求 3.特殊需求 有使用价值,我们才更多会去使用,去多学它。 二,什么是位运算? 位运算就是直接对整数在内存中的二进制位进行操作。 例如: 1 & 2 = 0b 0001 & 0b 0010 = 0b 0000 = 0 三,位运算简介 1.位运算符号 & :与运算 有0为零,同1出1。 | :或运算 全0为0,有1是1 ^ :异或运算 相同为0,不同为1 ~ :取反运算 和原情况相反 下面是一些基本情况的运算表。 右移 : >> 例如: 12 >> 2 = 0b 0000 1100 右移两位 结果为 0b 0000 0011 十进制为3 在不超过范围内,12 >>2 相当于12除以4(2的2次方) 左移 : << 例如: 12 << 2 = 0b 0000 1100 左移两位 结果为 0b 0011 0000 十进制为48 在不超过范围内,12<< 2 相当于12乘4(2的2次方) 注意:右移时,左侧补的是符号位。 例如 -32 >> 2 1000 0000 0000 0000 0000 0000 0010 0000原 1111 1111 1111 1111 1111 1111

【算法系列】位运算专题

試著忘記壹切 提交于 2019-12-09 21:06:45
位运算专题 目录 位运算专题 LeetCode 231 2的幂 1、分析 2、代码 LeetCode 762 二进制表示中质数个数计算置位 1、分析 LeetCode 136 只出现一次的数 1、分析 2、 代码 LeetCode 476 数字的补数 1、分析 2、代码 LeetCode 137 只出现一次的数字II 1、分析 2、代码 LeetCode 260 只出现一次的数字III 1、分析 2、代码 LeetCode 371 两整数之和 1、分析 2、代码 LeetCode 201 数字范围按位与 1、分析 2、代码 LeetCode 421 数组中两个数的最大异或值 1、分析 2、代码 LeetCode 477 汉明距离总和 1、分析 2、代码 LeetCode 231 2的幂 题目: https://leetcode-cn.com/problems/power-of-two/submissions/ 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 1: 输入: 1 输出: true 解释: 20 = 1 1、分析 如果我们用2进制来表示n,则如果是2的幂次方,那么它的最高位一定是1,且只有这一个1,在位运算中,有一个操作是n&-n表示n从低位数起的第一个1的位置k,最后值为2^k,例如n=6,二进制为110,则-n是n的反码加1,即001+1=010

【LeetCode】78. 子集 结题报告 (C++)

℡╲_俬逩灬. 提交于 2019-12-08 06:21:55
原题地址: https://leetcode-cn.com/problems/subsets/description/ 题目描述: 给定一组 不含重复元素 的整数数组 nums ,返回该数组所有可能的子集(幂集)。 说明: 解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 解题方案: 第一次使用位运算的方法解题,对于本题,采用位运算的方法真的很方便。若nums的长度为n,则遍历2n2n次,每次得到一个子集: 将i看成二进制码流,判断j位是0还是1,如果为1,则选中nums[j]添加到子集中,从而得到一个子集vec 将子集vec保存进res 返回res class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { int n = nums.size(); int all = 1 << n; vector<vector<int>> res;//存放最后的结果 for(int i = 0; i < all; i++){ vector<int> vec; for(int j = 0; j < nums.size(); j++){ if((i & (1 << j)) != 0