C中的 "<<" 位运算符

C中的 "<<" 位运算符
         在我们的教科书中和平时写的小型应用程序中,很少能见到“<<”移位运算符,个人觉得原因有几个,第一、我们的程序中时常使用的是十进制数据,如“10”、“0.5”,很少会用到十六进制的数。其次,大部分的初级程序员脑子里没有二进制、八进制、十六进制的影子,一方面由于学校教育的缺陷所致、一方面是,生活中所见大多十进制的数据。
 
       为什么要用到非十进制的数制?
答:因为字节是内存的基本数据单位。八进制在计算机系统里不着重要且奇特的作用,或者说所有和二的N次方(2、4、8、16 ... ... 256、512、1024)的数都和计算机有着莫大的联系。

        什么地方,我们会时常见到这些数据?
答:具个人所见,在表示内存地址、寄存器地址、端口地址,及对一些寄存器进行附值操作时,会时常用到。

        如何对非十进制数据进行操作?
 答:在C里有不少的运算符提供了这些功能。比如:~位取反,& 位逻辑与 ,| 位逻辑或,^ 位逻辑异或,>> 右移,<< 左移 。用这些操作符,可以以二进制的方式操作数据。

        为什么要学这些?
答:这个问题很有意思、也是我们在学习之前必须弄清楚的,如果不知道有什么用,那学完很快就会忘记,且学起来毫无热情可言。废话多了,当你打算拿C做一些底层操作,或者你打算在不久的将来或你现在就打算征服Linux内核,那就很有必要学学了,学得好是帮助,学得不好是瓶颈,有点言重了,呵呵!!

在众多的位操作符中,偶最常见的就是"<<"这个啦!所以这些只打算说说它,如果你对其他的感兴趣,可自行早资料看看。

首先、你有必要确定你的机器上装了VC6或VC2005,我这里装了2005
然后、复制下面这个程序,到你机器上运行下
#include  < iostream >  
using 
Namespace std namespace std;

int main(){
        
int a = 1;
    cout
<<a<<endl;
    a 
= a<<10;
    cout
<<a<<endl;

    
return 0;
}
打印出来的是 > 1024
为什么是1024?
看到没?上面的代码,中间有一句是怎么写的 > a = a<<10;
对,就是它了,左移位运算符号,这句话做的事情是:
先将a里的1转化为二进制的1,然后将他左移10位,每移一位补一个0上去,运行这句之后a在机器里的二进制就成了 10000000000  化为十进制 1*2 10=1024

哈哈,是不是有点晕,没事,再运行下,下面的程序就完全了解了
#include  < iostream >  
using 
Namespace std namespace std;

int main(){
    
int a = 1;
    cout
<<a<<endl;
    a 
= a<<10;//1*1024
    cout
<<a<<endl;
    a 
= 1;
    a 
= a<<8;//1*256
    cout
<<a<<endl;
    a 
= 2;
    a 
= a<<9;//2*512
    cout
<<a<<endl;

    
return 0;
}

总结一下,这里a<<n 可以看成 a * 2 n 这下了解吧^_^

接下来再介绍下如何在头文件里使用<<吧!在头文件里定义的是宏,所以,一旦定义错误,编译的时候并不会提示出错,而运行就找了麻烦了,所以一定要小心哦!下面给个简单的例子吧!

i.h
#define  A(var) (var<<10)
main.c
#include  < iostream >  
using   namespace  std;

#include
" i.h "

int  main()
{
    cout
<<A(1)<<endl;

    
return 0;
}

上面,不过是些极其简单的内容,如果想正真了解,请多看一些低层代码并多多实践吧!


地震让大伙知道:居安思危,才是生存之道。

你可能感兴趣的:(C中的 "<<" 位运算符)