目录:
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<<3
static int a;
void set_bit3(){
a|=BIT3;
}
void clear_bit3(){
a&=~BIT3;
}
分享到:
相关推荐
单片机的C语言中位操作用法
单片机的C语言中位操作用法 位的操作在单片机的中的作用是很大的 效率啊 要不高手怎么都用位操作
单片机的C语言中位操作用法
C语言_位操作,如何判断某一位是1还是0
C语言位操作,在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行...
本文给大家分享了单片机C语言位操作实例。
C语言编程开发中用好位操作符.doc C语言编程开发中用好位操作符 1. C语言中的位操作符
c语言的位操作.docx
C语言位操作——复习笔记 绝好的学习资料
基于C语言实现64位操作系统的设计与实现源码.zip基于C语言实现64位操作系统的设计与实现源码.zip基于C语言实现64位操作系统的设计与实现源码.zip基于C语言实现64位操作系统的设计与实现源码.zip基于C语言实现64位...
C语言位操作相关学习记录
关于C语言位操作,左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。
关于C语言的课件,关于位运算和预处理命令。
AVR单片机C语言程序设计中的位操作:在标准C语言的的教材中,对于位运算的操作是基本不涉及的,但是在单片机系统的程序中,需要经常操作各类以字节为单位的寄存器,而这些寄存器通常都是以二进制中的位为控制单位的...
单片机c语言位操作.pdf
C语言位操作总结.pdf