C语言中 “>>=,<<=,&=,^=,|=” 分别表示什么意思? 举例说明

1、C语言中的 >>= 意思为:右移赋值

代码示例为:

x = 8; 
x >>= 3; 
右移后结果为:00000000 00000000 00000000 00000001

在这里插入图片描述

2、C语言中的 <<= 意思为:左移后赋值

代码示例为:

x = 8;
x <<= 3; 
左移后赋值结果为:00000000 00000000 00000000 01000000

在这里插入图片描述

3、C语言中的 &= 意思为:按位与后赋值

代码示例为:

x = 0x02; 
x &= 0x01; 
按位与后的结果为:0x00

C语言中 “>>=,<<=,&=,^=,|=” 分别表示什么意思? 举例说明_第1张图片

4、C语言中的 ^= 意思为:按位异或后赋值

代码示例为:

//注释之后的是16进制对应的2进制
x = 0x02;    //0010
x ^= 0x01; //0001
按位异或的结果为:0x03 等同于0011

C语言中 “>>=,<<=,&=,^=,|=” 分别表示什么意思? 举例说明_第2张图片
5、C语言中的 |= 意思为:按位或后赋值

代码示例为:

x = 0x02; //0010
x  |= 0x01;//0001
按位或的结果为:x等同于0011

C语言中 “>>=,<<=,&=,^=,|=” 分别表示什么意思? 举例说明_第3张图片

问题1“或和异或”

初学开发的人,总是搞不清“或“运算和“异或“运算的本质区别,只知道对于或运算来说,结果是:只要有一个为1,就为1,只有都为0才为0;而异或的结果是相同为0,不同为1,这么说大家只是记住了一个运算法则,确不明白它们的意义,举个例子来说它们之间的区别:

先说或的意义:

有学生证或者血型是AB型的人才可以免费吃我们提供的午餐,这里存在3种情况都可以免费吃午餐:

1)有学生证的人

2)AB型的人,可能不是学生啊!

3)既是AB型,又有学生证的人,两种条件都满足,这是或运算最大的特点。

再说异或的意义:

只有中国人和美国人可以免费领取我们提供的特色服务,这里只有两种情况:

1)是中国人

2)是美国人

大家仔细思考,异或没有既是中国人,又是美国人的情况,因为一个人的国籍只可能是一种,这就是异或与或最大的差别,在异或中,测试对象只可能满足一个条件,而在或运算中,测试对象可以同时满足2个条件。

问题2,为什么用16进制来记录内存地址

由于字节(byte)在计算机内部出现的频率较高,如果可以使用一种简洁的方式将它的内在含义准确表达出来,将会给我们带来很多方便。选择十六进制,是因为8位二进制的数字可以方便的转换为2个十六进制的数字。一个字节能且只能由一对十六进制来表示,比如10110110可以表示为B6。如果使用4进制的话则需要使用4个数字来表示一个字节,不够简洁;使用8进制的话,最靠左的8进制数是由2位二进制数字来表示的,相比于使用16进制有些美中不足。

1 应用场景:pamp

在gdb 或者pmap查看内容的时候经常出现 如下 0x8462960,0x8462960含义是啥

例如

wang@ubuntu:~/study/code$ pmap -d 1468 >>aaa
wang@ubuntu:~/study/code$ vi aaa
1468:   ./server
Address   Kbytes Mode  Offset           Device    Mapping
00110000     116 r-x-- 0000000000000000 008:00001 libgcc_s.so.1
0012d000       4 r---- 000000000001c000 008:00001 libgcc_s.so.1
0012e000       4 rw--- 000000000001d000 008:00001 libgcc_s.so.1
00142000    1380 r-x-- 0000000000000000 008:00001 libc-2.11.1.so
0029b000       8 r---- 0000000000159000 008:00001 libc-2.11.1.so
0029d000       4 rw--- 000000000015b000 008:00001 libc-2.11.1.s

0x8462960 是 内存地址.
十六进制的表示:
C语言、Shell、Python语言及其他相近的语言使用字首“0x”,例如“0x5A3”。开头的“0”令解析器更易辨认数,而“x”则代表十六进制(就如“O”代表八进制)。在“0x”中的“x”可以大写或小写,0-9对应0-9;A-F对应10-15;N进制的数可以用0—(N-1)的数表示超过9的用字母A-F。

2 具体说明:内存地址空间为何用十六进制表示

编程中,我们常用的还是10进制.毕竟C/C++是高级语言。

比如:int a = 100,b = 99;   

不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决 问题。但二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:

0000 0000 0000 0000 0110 0100   

面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。

参考:http://www.cppblog.com/hex108/archive/2011/06/18/124234.html

你可能感兴趣的:(#,C++,c语言,开发语言)