关于常量指针与指针常量

关于按位运算符(&、|、<<、>>)

 

关于常量指针和指针常量

两个概念经常混淆啊,这是在考中文四六级啊,所以我给这两个概念起个长一点的名字。

常量指针 = 指向常量的指针

指针常量 = 指针是一个常量

前者的意思是,一个指针,它指向的地址所存放的数据是一个常量,这个地址里存的数据是不可变的,而这个指针是可以改变的,可以改变这个指针所指向的地址。

其定义形式为:int const *p = &m; 还有一种定义形式:const int *p = &m;

后者的意思是,一个指针,它本身就是一个不可变的常量,也就是说这个指针指向的地址是不可变的,而这个地址里所存放的数据是可以改变的。

其定义形式为:int* const p= &m;

找到一种帮助记忆的方法:无论哪种定义形式,我们规定带*号的就说成指针,所以观察定义的形式,有下划线的表示为常量,不带下划线的表示为指针,则从左向右读就是正确的含义。

 

 

关于按位运算符

下表列出了按位运算符。

运 算 符

说 明

~

这是按位求反运算符。它是一个一元运算符,可以反转操作数中的位,即1变成0,0变成1

&

这是按位与运算符,它对操作数中相应的位进行与运算。如果相应的位都是1,结果位就是1,否则就是0

^

这是按位异或运算符,它对操作数中相应的位进行异或运算。如果相应的位各不相同,例如一个位是1,另一个位是0,结果位就是1。如果相应的位相同,结果位就是0

|

这是按位或运算符,它对操作数中相应的位进行或运算。如果两个对应的位中有一个是1,结果位就是1。如果两个位都是0,结果就是0

 

表中的运算符按照其优先级排列,在这个集合中,按位求反运算符的优先级最高,按位或运算符的优先级最低。在附录D的运算符优先级表中,按位移动运算符<<和>>具有相同的优先级,它们位于~运算符的下面,&运算符的上面。(摘自这篇文章)。

具体用法可以参考其他文章,这里只从一个进制转换的例子简单分析其中两个运算符的用法。下面给出十进制数转换为二进制并输出。

void tenTOtwo()
{
cout<<"输入一个10进制数:"<<endl;
int x;
cin>>x;
int len = sizeof(int)*8; //sizeof(int)的值为4 即一个int型占4个字节,每个字节8bit,一个int型就占了32bit
for (int i = len-1;i>-1;i--) //循环32次
{
/*int temp = 1<<i;
int s = 1<<i;
char* temp1 = x&1<<i?"1":"0";
cout<<"5&"<<s<<"="<<temp1<<endl;*/
char* temp = x&1<<i?"1":"0"; //x和1左移i位后的数求与运算
cout<<temp;
if(i%8==0) //每到8个bit(即一个字节) 输入一个空格
cout<<" ";
} cout<<endl;
}

这个算法非常巧妙的利用了"按位与操作"和"按位左移操作"。首先说明一下这两个操作符的效果。

按位与运算:两个位做与运算,全都为1,则结果为1,否则为0;

例如二进制2(00000010)与二进制3(00000011)

00000010

&

00000011

 

00000010 结果是2。

左移运算:n<<m;将n左移m位,相当于将n的二进制位整体向左移动m位,左侧移除的舍弃,右侧移进的补0。效果就是把每一个位乘以2的m次方,也就是n*2m

例如int val = 8<<3; 将2(00001000)向左移动3位,变为64(01000000),即8*23= 8*8=64。

 

 

分析一下这个算法的大体思路:

1.确定一个int型变量所占的位数,32位int占用4个字节,每个字节占用8个bit,所以一个int型变量占用32个bit。

2.循环32次,每次只设定其中一个bit为1,令只有一个bit为1的32位二进制与待转换的十进制数按位与运算。

3.按位与运算,结果为1,则这个32位二进制中当前为1的位所对应的这个十进制数的位也为1。

然后看具体代码:

int len = sizeof(int)*8;   //获取一个int型整数占多少个bit
然后 for (int i = len-1;i>-1;i--) 循环32次,每次将1(00000000 00000000 00000000 00000001)向左移i位。
第1次移动31位,即:10000000 00000000 00000000 00000000 第2次移动30位,即:01000000 00000000 00000000 00000000
第3次移动29位,即:00100000 00000000 00000000 00000000
.....
第30次移动2位,即:00000000 00000000 00000000 00000100
第31次移动1位,即:00000000 00000000 00000000 00000010
第32次移动0位,即:00000000 00000000 00000000 00000001

用移位后的二进制数2的31次方、2的30次方....直到2的1次方、2的0次方和待转换的数字x进行与(&)运算。
假如x&2的31次方,结果为1,则x的第一位是1,否则就是0。以此类推,便可通过32次的循环,得到哪些位是1,哪些位是0。
这里输入十进制的5,将5转换为二进制。程序运行结果:


 

风筝的C++随时记的更多相关文章

  1. DOM随时记

    1.node-type 返回元素的节点类型:可以在标签上进行设置 node-type="item"   ---来自新浪微博的首页写法

  2. Golang哲学思想

    Golang是一门新语言,经过几年发展,慢慢地也已经被许多大公司认可.最大的特点是速度快,并发性好,与网络的功能结合好,是一门服务端语言,号称“网络时代的新语言”:另外还是一个编译型的Python.不 ...

  3. Runtime-b

    感谢大神分享 依旧是网上很多runtime的资料,依旧是看不懂,,,这里给大家转化一下runtime,使它由隐晦难懂变得通俗易懂. (虽然截图和语言组织的有些凌乱,但是大家还是一点一点的阅读下去吧,可 ...

  4. MarkDown---超强文本编辑器

    What you see Is What you  get ... --------------------------- Salmon 编辑器界面: ------------------------ ...

  5. NodeJs学习笔记(三)

    最近在用sails框架写移动后台,马上就过年了,打算总结一下.   1.资源      node官方网站: www.nodejs.org      sails官方网站:www.sailsjs.org ...

  6. Java——泛型

    前言 一般的类和方法,使用的都是具体的类型:基本类型或者自定义的类.如果我们要编写出适用于多种类型的通用代码,那么肯定就不能使用具体的类型.前面我们介绍过多态,多态算是一种泛化机制,但是也会拘泥于继承 ...

  7. 使用Node.js+Hexo+Github搭建个人博客

    一.为什么要花时间去搭建个人博客? 首先说说为什么我想要尝试着去搭建属于自己的Blog,古人云:“好记性不如烂笔头”.一开始我把笔记做在本子上.电脑上,发现要用的时候特别地不方便,而且越记越多.越多越 ...

  8. hexo 博客

    梦飞扬~ 个人网站:Mauger`s Blog 博客园 标签 新随笔 随笔 管理 Github 随笔 - 61  文章 - 1  评论 - 0 使用Node.js+Hexo+Github搭建个人博客 ...

  9. [1-4] 把时间当做朋友(李笑来)Chapter 4 【开拓我们的心智】 摘录

    1. 获得知识的基本途径  所有的人获取知识的最为基础的手段就是“体验”. 比“体验”再高级一点的获取知识的手段,就是“试错”(Trial and Error). 在“试错”这个手段的基础上,另外一个 ...

随机推荐

  1. 《CODE》读后笔记——第14~20章

    14.反馈与触发器 振荡器不需要人的干涉即可自主且不断地实现断开和闭合.所有计算机都靠某种振荡器来使其他部件同步工作. 当两个开关都断开时,电路有两个稳定状态,这样的一个电路称为触发器.触发器具有记忆 ...

  2. MvcPager 免费开源分页控件3.0版发布!

    MvcPager 3.0版在原2.0版的基础上进行了较大的升级,对MvcPager脚本插件重写并进行了大量优化.修复了部分bug并新增了客户端Javascript API等功能,使用更方便,功能更强大 ...

  3. 删除所选项(附加搜索部分的jquery)

    1.视图端(views)的配置为: <script> $(document).ready(function() { $("#info-grid").kendoGrid( ...

  4. sqlserver开启'xp_cmdshell'命令

    --sql server中开启xp_cmdshell命令 1. --允许配置高级选项 GO RECONFIGURE GO . --开启xp_cmdshell服务 RECONFIGURE GO . -- ...

  5. Android中如何查看so崩溃的log

    两种方法: 一.android自带的arm-eabi-addr2line工具 例如, - :: I DEBUG : # pc 0000d766 /system/lib/libtest.so - :: ...

  6. QQ浏览器安卓5.8版本的Uint8Array API有bug

    调用new Uint8Array()时QQ浏览器将直接返回参数列表, 比如new Uint8Array(a)将返回[a],比如new Uint8Array(a, b)将返回[a, b],比如new U ...

  7. 在Windows上编译最新的CURL,含有zlib,openssl

    最近,从网上下载了一个curl库,使用时各种报错,都无法启动,于是干脆就直接自己编译了. 1. 准备工作 a. 下载zlib zlib可以使得HTTP请求支持gzip压缩,其地址如下: 官网:http ...

  8. Partial backup 备份指定表/库

    Partial Backups XtraBackup支持partial backups,这意味着你可以只备份部分表或库.要备份的表必须是独立表空间,即innodb_file_per_table=1 有 ...

  9. 使用joi来验证数据模型

    我们用nodejs实现一些功能时,往往需要对用户输入的数据进行验证.然而,验证是一件麻烦的事情,很有可能你需要验证数据类型,长度,特定规则等等,在前端做表单验证时,我们常用的做法是使用正则,正则表达式 ...

  10. ExtJS 列表数据编辑

    在ExtJs中,GridPanel一般用于展示列表数据.同时利用一些附加的插件也能编辑数据.类似于asp.net中的DataGridView控件. 展示数据比较简单,利用Store则可以自动展示,只要 ...