`
dazhilao
  • 浏览: 245929 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

位运算符

阅读更多

一、位运算符C语言提供了六种位运算符:

& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移


1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

  按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}


2. 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下: 00001001|00000101
00001101 (十进制为13)可见9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}

3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)
main(){
int a=9;
a=a^15;
printf("a=%d\n",a);
}

4. 求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110

5. 左移运算 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,
高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6. 右移运算 右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
请再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}

位域

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度

例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:

1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。

3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。

二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}

上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。

类型定义符typedef

C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。 类型定义符typedef即可用来完成此功能。例如,有整型量a,b,其说明如下: int aa,b; 其中int是整型变量的类型说明符。int的完整写法为integer,

为了增加程序的可读性,可把整型说明符用typedef定义为: typedef int INTEGER 这以后就可用INTEGER来代替int作整型变量的类型说明了。 例如: INTEGER a,b;它等效于: int a,b; 用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。例如:
typedef char NAME[20]; 表示NAME是字符数组类型,数组长度为20。
然后可用NAME 说明变量,如: NAME a1,a2,s1,s2;完全等效于: char a1[20],a2[20],s1[20],s2[20]
又如:
typedef struct stu{ char name[20];
int age;
char sex;
} STU;
定义STU表示stu的结构类型,然后可用STU来说明结构变量: STU body1,body2;
typedef定义的一般形式为: typedef 原类型名 新类型名 其中原类型名中含有定义部分,新类型名一般用大写表示, 以
便于区别。在有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,后者更为灵活方便。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/weilaixi/archive/2009/02/23/3927826.aspx

分享到:
评论

相关推荐

    C语言逻辑运算符和位运算符总结

    通过上述介绍可以看出,逻辑运算符和位运算符在C语言中扮演着非常重要的角色。逻辑运算符用于组合条件表达式,而位运算符则用于对整数进行位级别的操作。掌握这两种运算符的用法有助于编写更高效、更灵活的程序。

    使用位运算符实现数的逆转

    ### 使用位运算符实现数的逆转 在计算机科学领域,位运算符被广泛应用于各种算法优化及特定场景下的数据处理中。位运算符的操作对象是整数,在内存中以二进制形式存在,通过对这些二进制位进行操作来达到高效处理...

    基于 Java封装 的位运算符,使用位运算符时更加方便

    【作品名称】:基于 Java封装 的位运算符,使用位运算符时更加方便 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: ...

    13.java位运算符.zip

    13.java位运算符.zip13.java位运算符.zip13.java位运算符.zip13.java位运算符.zip13.java位运算符.zip13.java位运算符.zip13.java位运算符.zip13.java位运算符.zip13.java位运算符.zip13.java位运算符.zip13.java位...

    C语言关系运算符和位运算符PPT课件.pptx

    在C语言的编程世界里,关系运算符和位运算符是两个基础且核心的概念,它们分别在逻辑判断和数值底层操作方面发挥着不可替代的作用。为了帮助初学者更好地理解和应用这些运算符,一份详细的PPT课件尤为重要。本篇内容...

    Java中位运算符.pdf

    Java中位运算符 Java 中位运算符概述 Java 中位运算符是用于对二进制位进行操作的运算符。这些运算符可以对整型和字符型数据进行操作,操作结果为一个整数。位运算符可以分为一元运算符和二元运算符两种。 位...

    C语言位运算符在程序中的作用

    ### C语言位运算符在程序中的作用 C语言是一种广泛使用的高级编程语言,因其高效性和灵活性而备受青睐,尤其是在系统编程、嵌入式系统开发等领域。位运算符是C语言中一种重要的运算符类型,主要用于操作整数类型的...

    位运算符.docx

    位运算符在计算机科学和编程中扮演着重要的角色,尤其是在处理底层数据和高效计算时。这些运算符直接操作整型或字符型数据的二进制位,而不是它们的数值表示。位运算符主要分为两大类:位逻辑运算符和位移位运算符。...

    位运算符.pdf

    位运算符是编程语言中处理整型或字符型数据的一种特殊运算方式,它们直接操作数据的二进制位,而不是其数值表示。在计算机科学,尤其是计算机编程领域,位运算符有着广泛的应用,因为它们可以高效地进行底层的位级...

    java位运算符之&AND操作视频

    Java语言中的位运算符是编程中的一个重要组成部分,尤其是在处理二进制数据或者进行高效计算时。在Java中,"&"符号被用作位AND运算符,它在二进制级别上进行操作,对两个操作数的每一位进行比较,并返回一个新值。这...

    C语言按位运算符详解

    ### C语言按位运算符详解 #### 一、引言 在C语言中,按位运算符是一类非常重要的操作符,它们直接作用于整数的二进制表示上,通过对单个比特位进行操作来实现特定的功能。这对于低级编程、硬件控制以及优化算法等...

    C提供了六种位运算运算符

    ### C语言中的位运算符 在C语言中,位运算符是用于对整型数据进行按位操作的一类运算符。这些运算符只能应用于整型数据类型,包括`char`、`short`、`int`和`long`,无论是有符号(`signed`)还是无符号(`unsigned`...

    JS运算符—位运算符[借鉴].pdf

    JavaScript中的位运算符是用于操作数字的二进制表示,它们在处理整数时非常有用,尤其是在优化代码或进行低级别的数据操作时。在JavaScript中,位运算符主要有以下几种: 1. 按位与运算符(&) - 位与运算符会对两...

    C++位运算符.pdf

    C++位运算符是编程中处理二进制数据的重要工具,它们主要应用于底层系统编程、内存管理和硬件交互等场景。位运算符包括按位与(&),按位或(|),按位非(~),按位异或(^),左移()和右移(&gt;&gt;)。这些运算符都是针对整型...

    位运算符,位运算,位段

    位运算符允许程序员直接操作数据的二进制位,从而实现高效的数据处理和计算。本文将详细介绍位运算符,位运算,以及位段的概念。 首先,位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位非(~)以及移位...

    Java位运算符详解.docx

    "Java位运算符详解" Java 位运算符是 Java 编程语言中的一种基本操作符,用于对二进制数进行操作。位运算符可以分为六种:按位与运算符 (&)、按位或运算符 (|)、异或运算符 (^)、取反运算符 (~)、左移运算符 () 和...

    javascript运算符——位运算符全面介绍.docx

    ### JavaScript运算符——位运算符全面介绍 #### 一、引言 JavaScript作为一种广泛使用的编程语言,在前端开发、后端开发乃至数据科学等领域都有着举足轻重的地位。位运算符作为JavaScript运算符的一种,虽然不如...

    C语言关系运算符和位运算符PPT学习教案.pptx

    在C语言学习过程中,理解并熟练运用关系运算符和位运算符对于编写高效准确的代码至关重要。关系运算符用于比较,而位运算符则直接作用于二进制位,两者虽属于不同的范畴,但都是构成复杂表达式和控制结构的基础。 ...

    java位运算符.pdf

    Java中的位运算符是编程语言中一种强大的工具,它们直接操作整数类型的二进制位,包括`long`, `int`, `short`, `char`, 和 `byte`。这些运算符可以用于实现高效的位级操作,比如设置、清除、翻转和测试特定的位。 ...

    第02章 Java编程基础 08 位运算符与变量交换

    在Java编程语言中,位运算符是用于对整数类型(byte、short、int、long)的二进制表示进行操作的特殊运算符。这些运算符直接作用于数据的二进制位,提供了高效和底层的数据处理能力。本章将深入讲解位运算符及其在...

Global site tag (gtag.js) - Google Analytics