C语言位运算中鲜为人知的事

2014-09-24 11:53周岚
软件工程 2014年5期
关键词:左移右移规则

周岚

摘 要:在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。位运算说的简单一些,就是直接对整数在内存中的二进制位进行操作。希望通过本文让大家了解位运算中鲜为人知的事情。

关键词:位运算;规则;左移;右移;可移植

中图分类号:TP312 文献标识码:A

Abstract:In many system program often requires(bit)in a computing or processing.C language provides a calculation function,which makes the C language can be the same as the assembly language used to write the program.Bit operation that simple, just to integer in binary bits in memory operation.Hope that through this article to let everybody know the little-known things bit operation.

Keywords:bit operations;rules;left;right;transplantation

1 引言(Introduction)

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说的简单一些,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)[1]。

在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。

4 移位运算符(Shift operator)

在使用移位运算符时,我常常会思考这样两个问题:

(1)在向右移位时,空出的位是由0填充,还是由符号位填充?

(2)移位计数允许的取值范围是什么?

第一个问题的答案很简单,但有时却是与具体的C语言实现有关。如果被移位的对象是无符号数,那么空出的位将被0填充[2]。如果被移位的对象是有符号数,那么C语言实现既可以用0填充空出的位,也可以用符号位的副本填充空出的位。我们如果关注向右移位时空出的位,那么可以将操作的变量声明为无符号类型,那么空出的位都会被设置为0。

另外,C语言中位移操作分为算术位移和逻辑位移,二者都表示为<<和>>运算符。

进行左移操作时,算术位移和逻辑位移都在结果右端补0。但是右移时有所不同,算术位移在左端填充符号位(正数为0,负数为1),逻辑位移在左端补0。位移运算的特性结合C算术运算时类型提升特性,很容易出错[3]。让我们再看一个例子。

5 结论(Conclusion)

综上所述,在进行位移操作时,一定要小心上溢,建议在进行左移时先强制将无符号数(unsigned short, unsigned char)转换为unsigned int,再进行运算。

参考文献(References)

[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2010:45-46.

[2] 魏书堤,赵辉煌.C语言二进制位运算教学设计[J].衡阳师范学院学报,2013(6):149-152.

[3] 赵忠孝,杨亚蕾.对C语言指针教学问题的探究[J].计算机教育,2009(19):78-79.

作者简介:

周 岚(1977-),女,硕士,讲师.研究领域:计算机程序设计,数据库.endprint

摘 要:在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。位运算说的简单一些,就是直接对整数在内存中的二进制位进行操作。希望通过本文让大家了解位运算中鲜为人知的事情。

关键词:位运算;规则;左移;右移;可移植

中图分类号:TP312 文献标识码:A

Abstract:In many system program often requires(bit)in a computing or processing.C language provides a calculation function,which makes the C language can be the same as the assembly language used to write the program.Bit operation that simple, just to integer in binary bits in memory operation.Hope that through this article to let everybody know the little-known things bit operation.

Keywords:bit operations;rules;left;right;transplantation

1 引言(Introduction)

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说的简单一些,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)[1]。

在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。

4 移位运算符(Shift operator)

在使用移位运算符时,我常常会思考这样两个问题:

(1)在向右移位时,空出的位是由0填充,还是由符号位填充?

(2)移位计数允许的取值范围是什么?

第一个问题的答案很简单,但有时却是与具体的C语言实现有关。如果被移位的对象是无符号数,那么空出的位将被0填充[2]。如果被移位的对象是有符号数,那么C语言实现既可以用0填充空出的位,也可以用符号位的副本填充空出的位。我们如果关注向右移位时空出的位,那么可以将操作的变量声明为无符号类型,那么空出的位都会被设置为0。

另外,C语言中位移操作分为算术位移和逻辑位移,二者都表示为<<和>>运算符。

进行左移操作时,算术位移和逻辑位移都在结果右端补0。但是右移时有所不同,算术位移在左端填充符号位(正数为0,负数为1),逻辑位移在左端补0。位移运算的特性结合C算术运算时类型提升特性,很容易出错[3]。让我们再看一个例子。

5 结论(Conclusion)

综上所述,在进行位移操作时,一定要小心上溢,建议在进行左移时先强制将无符号数(unsigned short, unsigned char)转换为unsigned int,再进行运算。

参考文献(References)

[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2010:45-46.

[2] 魏书堤,赵辉煌.C语言二进制位运算教学设计[J].衡阳师范学院学报,2013(6):149-152.

[3] 赵忠孝,杨亚蕾.对C语言指针教学问题的探究[J].计算机教育,2009(19):78-79.

作者简介:

周 岚(1977-),女,硕士,讲师.研究领域:计算机程序设计,数据库.endprint

摘 要:在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。位运算说的简单一些,就是直接对整数在内存中的二进制位进行操作。希望通过本文让大家了解位运算中鲜为人知的事情。

关键词:位运算;规则;左移;右移;可移植

中图分类号:TP312 文献标识码:A

Abstract:In many system program often requires(bit)in a computing or processing.C language provides a calculation function,which makes the C language can be the same as the assembly language used to write the program.Bit operation that simple, just to integer in binary bits in memory operation.Hope that through this article to let everybody know the little-known things bit operation.

Keywords:bit operations;rules;left;right;transplantation

1 引言(Introduction)

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说的简单一些,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)[1]。

在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。

4 移位运算符(Shift operator)

在使用移位运算符时,我常常会思考这样两个问题:

(1)在向右移位时,空出的位是由0填充,还是由符号位填充?

(2)移位计数允许的取值范围是什么?

第一个问题的答案很简单,但有时却是与具体的C语言实现有关。如果被移位的对象是无符号数,那么空出的位将被0填充[2]。如果被移位的对象是有符号数,那么C语言实现既可以用0填充空出的位,也可以用符号位的副本填充空出的位。我们如果关注向右移位时空出的位,那么可以将操作的变量声明为无符号类型,那么空出的位都会被设置为0。

另外,C语言中位移操作分为算术位移和逻辑位移,二者都表示为<<和>>运算符。

进行左移操作时,算术位移和逻辑位移都在结果右端补0。但是右移时有所不同,算术位移在左端填充符号位(正数为0,负数为1),逻辑位移在左端补0。位移运算的特性结合C算术运算时类型提升特性,很容易出错[3]。让我们再看一个例子。

5 结论(Conclusion)

综上所述,在进行位移操作时,一定要小心上溢,建议在进行左移时先强制将无符号数(unsigned short, unsigned char)转换为unsigned int,再进行运算。

参考文献(References)

[1] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2010:45-46.

[2] 魏书堤,赵辉煌.C语言二进制位运算教学设计[J].衡阳师范学院学报,2013(6):149-152.

[3] 赵忠孝,杨亚蕾.对C语言指针教学问题的探究[J].计算机教育,2009(19):78-79.

作者简介:

周 岚(1977-),女,硕士,讲师.研究领域:计算机程序设计,数据库.endprint

猜你喜欢
左移右移规则
华容道玩法大解密
数独的规则和演变
太极拳养生八式(中)
太极拳养生八式(上)
让规则不规则
TPP反腐败规则对我国的启示
BMH2C单模匹配算法的研究与改进
开怀一笑