0
点赞
收藏
分享

微信扫一扫

位运算第一节

天行五煞 2022-03-11 阅读 111
c语言

12.1位运算符和位运算

12.2位运算举例

12.3位段

位运算是指按二进制位进行的运算。因为在系统软件中,常要处理二进制位的问题。

例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。

C语言提供位运算的功能,与其他高级语言(如PASCAL)相比,具有很大的优越性。

运算符  含义       运算符    含义     

  &   按位与        ~      取反

  |    按位或        <<      左移

  ∧   按位异或      >>      右移

(1)位运算符中除~以外,均为二目(元)运算符,即要求两侧各有一个运算量。

(2)运算量只能是整型或字符型的数据,不能为实型数据。

按位与 运算符(&)

含义:参加运算的两个数据,按二进制位进行“与”运算。

如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。

例如:

0&0=0,0&1=0,

1&0=0,1&1=1

n 注意:

3&5并不等于8,应该是按位与运算:

如果参加&运算的是负数(如-3&-5),则要

以补码形式表示为二进制数,然后再按位进行

“与”运算。

按位与运算的用途

一、 清零

若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合以下条件:原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。

n 例如:要求将二进制数11100101的第2位清零

二、取一个数中某些指定位

例如:我们需要对一个字型数据取出其低8位的值时,我们可以这么做。

11010101

01011011

&

00000000

11111111

00000000

01011011

按位或 运算符(|)

两个相应的二进制位中只要有一个为1,该位的结果值为1。

即:

0|0=0,0|1=1,

1|0=1,1|1=1

例如:

   00110000

|  00001111

   00111111

题目:

编写一个小程序,将输入的大写字母转换为小写字母,输入的小写字母转换为大写字母,要求用位操作完成转换过程。

#if 1
#include <stdio.h>
#include <conio.h>

void main()
{
char ch, temp;

printf("请输入一个字母: \n");
ch = getchar();
temp = getchar();

while( !(ch>'A' z') || (ch > 'Z' &a') )
{
printf("输入有误, 请重新输入一个字母: \n");
ch = getchar();
}
if( ch & 32 )
{
ch = ch ß // 使第五位为0,变大写
}
else
{
ch = ch | 255; // 使第五位为1,变小写
}

putchar(ch);

printf("\n");
}
#endif

 最后执行printf("\n")为什么会打印大写字母,需要问

异或运算符(∧)

异或运算符∧也称XOR运算符。

它的规则是:

若参加运算的两个二进制位同号则结果为0

(假),异号则结果为1(真)

即:0∧0=0,0∧1=1,1∧0=1, 1∧1=0

例如:

   00111001

 00101010

   00010011

∧运算符应用

一、使特定位翻转

设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算,即:

   01111010

 00001111

   01110101

二、与0相∧,保留原值

例如:

00001010

 00000000

   00001010

因为原数中的1与0进行∧运算得1,0∧0得0,故保留原数。

三、交换两个值,不用临时变量

!这玩意新鲜!

例如: a=3,b=4,现在想将a、b变量的值交换位置,我们传统的做法是定义多一个temp变量,而现在temp去度蜜月了,怎么办?

我们可以这样做:

a=a∧b;

b=b∧a;

a=a∧b;   这种方法也常应用于加密算法。

举报

相关推荐

0 条评论