六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 30|回复: 0

C语言中的位操作

[复制链接]

升级  51.33%

35

主题

35

主题

35

主题

秀才

Rank: 2

积分
127
 楼主| 发表于 2013-1-27 05:10:24 | 显示全部楼层 |阅读模式
目录:
1.前言
2.数值在计算机中的表示
3. 位运算
4.位段



正文:

1.前言

为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以她提供了实现将标志状态从标志字节中分离出来的位运算功能。

所谓位运算是指,按二进制位进行的运算。



2.数值在计算机中的表示

1) 二进制位与字节

计算机系统的内存储器由许字节的单元组成

1byte=8bit(每位的取值为0/1)

7 6  5  4  3  2  1  0  

上图表示一个字节的编号,最左端位最高位,最右端为最低位


2) 数值的原码表示

原码:
最高位为符号位(0正数,1负数),其余各位代表数值本身的绝对值(以二进制表示)

PS:约定用1个字节表示1个整数

例:+9 --> 0000 1001

    -9 --> 1000 1001   
                             

3) 数值的反码表示

反码:
正数=原码
负数=符号位不变,其余位取反

例:+9--->0000 1001
    - 9--->1111 0110


4) 数值的补码表示

补码:
正数=原码
负数=符号位不变,其余按位取反,然后整个数加1

例:+9--->0000 1001
    - 9--->1111 0111


5) 数值在计算机中的表示──补码

在计算机系统中,数值一律用补码表示(存储),原因在于:

    * 可以将符号位和其它位统一处理
    * 减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃.




3.位运算

3.1 位运算及其运算符

Note:(1)x,y和位数等操作数只能为int,char型.(2)仅~为单目运算符,其余均为双目运算符(3)~0间接构造一个全1的数

1) 按位与 ──  &
        (1)格式:x&y
        (2)规则:对应位均为1时才为1,否则为0:3&9=1。
        (3)主要用途:取(或保留)1个数的某(些)位,其余各位置0。

例,3&9=1

           0011
         & 1001   
        ────         
          0001=1  

2)按位或 ── |
        (1)格式:x|y
        (2)规则:对应位均为0时才为0,否则为1:3|9=11。
        (3)主要用途:将1个数的某(些)位置1,其余各位不变。

例,3|9=11

           0011  
        |  1001   
       ────         
         1011=11                                      
      

3)按位异或---^

        (1)格式:x^y

        (2)规则:对应位相同为0,不同为1:3^9=10。

        (3)主要用途:将1个数的某(些)位置1,其余各位不变。


4)按位取反── ~

        (1)格式:~x

        (2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1:在IBM-PC机中,

                 ~0=0xffff,~9=0xfff6。

        (3)主要用途:间接地构造一个数,以增强程序的可移植性。

5)按位左移── <<

        (1)格式:x<<位数

        (2)规则:使操作的各位左移,低位补0,高位溢出:5<<2=20。


6)按位右移──>>

        (1)格式:x>>位数

        (2)规则:使操作的各位右移,移出的低位舍弃;

             高位:1)对无符号数和有符号中的正数,补0;

                   2)负数取决于所使用的系统:补0的称为逻辑右移,补1的称为算术右移



位操作的应用:
   

例子1:

         从键盘上输入1个正整数给int变量num,输出由8~11位构成的数(从低位、0号开始编号)。

基本思路:

(1)使变量num右移8位,将8~11位移到低4位上。

(2)构造1个低4位为1、其余各位为0的整数。

(3)与num进行按位与运算.  

程序:

#include<stdio.h>int main(void){       int num;              int num1;       int res;       printf("Input the num:");       scanf("%d",&num);       num1=~(1<<4);      //构造一个低4位为1的整数       num=num>>8;       //输入的数右移动8位,使得低4位为原数的8-11位       res=num&num1;      //与运算得到8-11位的数,其余位为0       printf("The result is %d\n",res);        return 0;}



例子2:

从键盘上输入1个正整数给int变量num,按二进制位输出该数。

程序:

#include  "stdio.h"main()    { int num, mask, i;       printf("Input a integer number: ");       scanf("%d",&num);       mask = 1<<15;  /*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/      printf("%d=" , num);      for(i=1; i<=16; i++)         { putchar(num&mask ? '1' : '0'); /*输出最高位的值(1/0)*/            num <<= 1;  /*将次高位移到最高位上*/            if( i%4==0 ) putchar(','); /*四位一组,用逗号分开*/        }      printf("\bB\n");    }



例子3:

给定一个整数a,写两个函数,第一个对a设置bit3,第二个清除bit3,其它位不变。

程序:

#define BIT3 ox1<<3static int a;void set_bit3(){            a|=BIT3;}void clear_bit3(){           a&=~BIT3;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表