位运算问题

位运算

  位运算是把数字用二进制表示之后,对每一位上0或者1的运算。

  理解位运算的第一步是理解二进制。二进制是指数字的每一位都是0或者1.比如十进制的2转化为二进制之后就是10。在程序员的圈子里有一个流传了很久的笑话,说世界上有10种人,一种人知道二进制,而另一种人不知道二进制。。。。。。

  其实二进制的运算并不是很难掌握,因为位运算总共只有5种运算:与、或、异或、左移、右移。如下表:

与(&)0 & 0 = 01 & 0 = 00 & 1 = 01 & 1 = 1
或(|)0 | 0 = 01 | 0 = 10 | 1 = 11 | 1 = 1
异或(^)0 ^ 0 = 01 ^ 0 = 10 ^ 1 = 11 ^ 1 = 0

左移运算

  左移运算符m<<n表示吧m左移n位。左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0.比如:

00001010 << 2 = 0010100010001010 << 3 = 01010000

右移运算

  右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但右移时处理最左边位的情形要稍微复杂一点。这里要特别注意,如果数字是一个无符号数值,则用0填补最左边的n位。如果数字是一个有符号数值,则用数字的符号位填补最左边的n位。也就是说如果数字原先是一个正数,则右移之后再最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1.下面是堆两个8位有符号数作右移的例子:

00001010 >> 2 = 0000001010001010 >> 3 = 11110001

补充:

      右移运算x>>k的行为有点微妙。一般而言,及其支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0;算术右移是在左端补k个最高有效位的值。

      c语言标准并没有明确定义应该使用哪种类型的右移。对于无符号数据(也就是以限定词unsigned声明的整型对象),右移必须是逻辑的。而对于有符号数 据(默认的声明的整型对象),算术的或者逻辑的右移都可以。但是,这也意味着任何假设一种或者另一种右移形式的代码都存在潜在着可移植性问题。实际上,几 乎所有的编译器/机器组合都对有符号数据使用算术右移,并且我们一般都假设机器会使用这种右移(算术右移)。

 

       关于移位的运算有这样的等价关系:把整数右移一位和把整数除以2在数学上是等价的。

a << = 1 ; //a左移一位等效于a = a * 2;

a << = 2 ; //a左移2位等效于a = a * 2的2次方(4);

   计算机内部只识别1、0,十进制需变成二进制才能使用移位运算符<<,>> 。

int j = 8;
p = j << 1;
cout<<p<<endl;

  在这里,8左移一位就是8*2的结果16 。

  移位运算是最有效的计算乘/除乘法的运算之一

  按位与(&)其功能是参与运算的两数各对应的二进制位相与。只有对应的两个二进制位均为1时,结果位才为1,否则为0 。参与运算的数以补码方式出现。

先举一个例子如下:

  题目:请实现一个函数,输入一个正数,输出该数二进制表示中1的个数。

复制代码
1 int count(BYTE n)
2 {
3 int num = 0; 4 while(n){ 5 n &= (n - 1); 6 num++; 7  } 8 return num; 9 }
复制代码

  这里用到了这样一个知识点:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0 。 那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

  总结:把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0 。

位运算的应用可以运用于很多场合:

  1. 清零特定位(mask中特定位置0,其它位为1 , s = s & mask)。
  2. 取某数中指定位(mask中特定位置,其它位为0, s = s & mask)。

举例:输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。

解决方法:第一步,求这两个数的异或;第二步,统计异或结果中1的位数。

复制代码
 1 #include<iostream>
 2 using namespace std;
 3  4 int main()  5 {  6 int a = 10 , b =13 , count = 0;  7 int c;  8 c = a ^ b;  9 while(c){ 10 c &= (c - 1); 11 count++; 12  } 13 cout<<count<<endl; 14 15 return 0; 16 }
复制代码

 

 接下来我们再举一例,就可以更好的说明移位运算了:用一条语句判断一个整数是不是2的整数次方。

解决方法:一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其它所有位都是0 。 根据前面的分析,把这个整数减去1后再和它自己做与运算,这个整数中唯一的1就变成0了。

解答:!(x & (x - 1))

 

转载于:https://www.cnblogs.com/13224ACMer/p/4613436.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

conda环境管理介绍

我们可以使用conda 来切换不同的环境&#xff0c;主要的用法如下&#xff1a; 1. 创建环境 # 指定python版本为2.7&#xff0c;注意至少需要指定python版本或者要安装的包 # 后一种情况下&#xff0c;自动安装最新python版本conda create -n env_name python2.7# 同时安装必…

unable to execute dex: multiple dex files Cocos2dxAccelerometer

原文转载&#xff1a;http://discuss.cocos2d-x.org/t/conversion-to-dalvik-format-failed-unable-to-execute-dex-multiple-dex-files-define-lorg-cocos2dx-lib-cocos2dxaccelerometer/6652/4 用cocos2dx2.2.3没问题&#xff0c;用了3.1.1出现这个问题。确实够蛋疼。还要有这…

PHP javascript 值互相引用(不用刷新页面)

PHP javascript 值互相引用的问题 昨天通过EMAIL给一些公司投了简历&#xff0c;希望他们能给我一份工作&#xff0c;今天其中一家公司的人给我打电话&#xff0c;大意是要我做一点东西&#xff08;与AJAX有关&#xff09; 给他们看&#xff0c;我听打电话的人问我的问题&#…

mysql自增_面试官:为什么 MySQL 的自增主键不单调也不连续?

为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章&#xff0c;我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有想要了解的问题&#xff0c;可以在文章下面留言。当我们在…

caffe 初学参考链接

最近在学习caffe&#xff0c;也搜集了一些资料&#xff0c;主要是一些网上公开的博客资源&#xff0c;现汇总一下&#xff0c;以便后面参考。 caffe 安装 编译py-faster-rcnn全过程caffe依赖库安装&#xff08;非root&#xff09;编译py-faster-rcnn的问题汇总及解决方法 ca…

java timer 定时任务

监听类1 package com.xx.model;2 3 import java.util.Calendar;4 import java.util.Date;5 import java.util.Timer;6 import javax.servlet.ServletContextEvent;7 import javax.servlet.ServletContextListener;8 import org.apache.commons.logging.Log;9 import org.apache…

python 打开txt_在python中从txt文件打开链接

我想请求一个rss程序的帮助。我所做的是收集包含我项目相关信息的网站&#xff0c;然后检查它们是否有rss提要。链接存储在txt文件中(每行一个链接)。因此&#xff0c;我有一个txt文件&#xff0c;其中包含了需要检查rss的基本url。在我找到了这个代码&#xff0c;这会使我的工…

IOS-awakeFromNib和viewDidLoad

awakeFromNib 当.nib文件被加载的时候&#xff0c;会发送一个awakeFromNib的消息到.nib文件中的每个对象&#xff0c;每个对象都可以定义自己的 awakeFromNib函数来响应这个消息&#xff0c;执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNib 。 viewDid…

使用过滤统计信息解决基数预估错误

基数预估是SQL Server里一颗隐藏的宝石。一般而言&#xff0c;基数预估指的是&#xff0c;在查询编译期间&#xff0c;查询优化器尝试找出在执行计划里从各个运算符平均返回的行数。这个估计用来驱动计划本身生成并选择正确的计划运算符——例如像Nested Loop, Merge Join,还是…

faster-rcnn系列学习之准备数据

如下列举了 将数据集做成VOC2007格式用于Faster-RCNN训练的相关链接。 RCNN系列实验的PASCAL VOC数据集格式设置 制作VOC2007数据集用于Faster-RCNN训练 将数据集做成VOC2007格式用于Faster-RCNN训练 这一篇比较详细地介绍了如何制造voc2007的所有文件&#xff0c;内含相关软件…

C# 委托链、多路广播委托

委托链、多路广播委托&#xff1a;也就是把多个委托链接在一起,我们把链接了多个方法的委托称为委托链或多路广播委托 例&#xff1a; 1 class HelloWorld2 {3 //定义委托类型4 delegate void DelegationChain();5 static void Main(string[] args)6 …

openssl 生成证书_使用证书和私钥导出P12格式个人证书!

【OpenSSL】使用证书和私钥导出P12格式个人证书1, 产生CA证书1.1, 生成ca的私钥openssl genrsa -out cakey.pem 20481.2, 生成ca的自签名证书请求openssl req -new -key cakey.pem -subj "/CNExample Root CA" -out cacsr.pem1.3, 自签名ca的证书openssl x509 -req -…

PHP (20140505)

数据库表与表之间的连接是用id联系。 join on&#xff1b;转载于:https://www.cnblogs.com/sunshine-c/p/3710283.html

py-faster-rcnn代码roidb.py的解读

roidb是比较复杂的数据结构&#xff0c;存放了数据集的roi信息。原始的roidb来自数据集&#xff0c;在trian.py的get_training_roidb(imdb)函数进行了水平翻转扩充数量&#xff0c;然后prepare_roidb(imdb)【定义在roidb.py】为roidb添加了一些说明性的属性。 在这里暂时记录下…

python 概率分布_python实现概率分布

伯努利分布from scipy import statsimport numpy as npimport matplotlib.pyplot as pltxnp.arange(0,2,1)xarray([0, 1])# 求对应分布的概率&#xff1a;概率质量函数 (PMF)p0.5# 硬币朝上的概率dfstats.bernoulli.pmf(x,p)dfarray([0.5, 0.5])#绘图vlines用于绘制竖直线(vert…

CodeForces 7D Palindrome Degree 字符串hash

题目链接&#xff1a;点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib…

程序清单8-9 回送所有命令行参数和所有环境字符串

1 /*2 3 Name : test.c4 Author : blank5 Version :6 Copyright : Your copyright notice7 Description : 程序清单8-9 回送所有命令行参数和所有环境字符串8 9 */ 10 11 #include "ourhdr.h" 12 13 int main(int argc, char *argv[]) 14…

SQL快速入门

关系化数据库保存关系模式数据的容器关系模式是对业务对象实体&#xff0c;属性以及关系的抽象&#xff0c;提炼需求的名词是建立实体关系模型常用的方法。要了解E-R实体关系图的绘制。常用关系数据库Microsoft SQL Server&#xff1b;微软公司产品&#xff0c;中等规模数据库&…

Faster RCNN minibatch.py解读

minibatch.py 的功能是&#xff1a; Compute minibatch blobs for training a Fast R-CNN network. 与roidb不同的是&#xff0c; minibatch中存储的并不是完整的整张图像图像&#xff0c;而是从图像经过转换后得到的四维blob以及从图像中截取的proposals&#xff0c;以及与之对…

oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)

前言哇。。看看时间 真的很久很久没写博客了 将近一年了。最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了。本篇主要讲一下关于Entity Framework Core访问oracle数据库的采坑。。强调一下&#xff0c;本篇文章发布之前 关于Entity Framework Core访问oracl…