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
4、C语言中的 ^= 意思为:按位异或后赋值
代码示例为:
//注释之后的是16进制对应的2进制
x = 0x02; //0010
x ^= 0x01; //0001
按位异或的结果为:0x03 等同于0011
5、C语言中的 |= 意思为:按位或后赋值
代码示例为:
x = 0x02; //0010
x |= 0x01;//0001
按位或的结果为:x等同于0011
问题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