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

}

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

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

(0)
上一篇 2022年10月5日 下午12:36
下一篇 2022年10月5日 下午12:36


相关推荐

  • 将menubar加入_java菜单栏工具栏

    将menubar加入_java菜单栏工具栏importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.EventListener;publicclassTestMenuBarextendsFrame/*implementsActionListener*/{MenuBarmenubar=newMenuBar();Menufi…

    2025年7月29日
    3
  • java.math.BigDecimal转换double double转换java.math.BigDecimal

    java.math.BigDecimal转换double double转换java.math.BigDecimal有方法 java math BigDecimal doubleValue BigDecimala newBigDecima 1000 returna doubleValue nbsp public nbsp static nbsp void nbsp printDoubleT double nbsp v1 nbsp double nbsp v2 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp BigDecimal nbsp d1TobigDe nbsp

    2026年3月18日
    2
  • 在 IT 外包公司工作有哪些优势和弊端?

    在 IT 外包公司工作有哪些优势和弊端?看外包公司的性质,有的是外包人力,有的是承接外包项目在自己公司做,有的是承接项目在外包公司做,也有的公司上面这几项同时做,同时也可能开发自己的产品。对用人单位来讲,短期看我喜欢外包人力,因为能解决公司人力紧缺的问题,同时外包人员和项目组成员配合更紧密,对项目出活有好处。我自己的亲身体会是,外包公司派过来的人一般要比自己的员工更努力,不挑活,他们希望通过好好表现,将来可以留在外派公司里。长期来看,我…

    2022年5月12日
    49
  • springboot启动类注解_常用设备启动方式分为几类

    springboot启动类注解_常用设备启动方式分为几类SpringBoot启动类packagecom.kmu.archives.system;importlombok.extern.slf4j.Slf4j;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplica

    2025年9月25日
    9
  • pki基于对称加密算法保证网络通信安全_网络安全体系结构

    pki基于对称加密算法保证网络通信安全_网络安全体系结构PKI(PublicKeyInfrastructure的缩写)即”公开密钥体系”,是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。PKI技术是信息安全技术的核心,也是电子商务的关键和基础技术。原有的单密钥加密技术采用特定加密密钥加密数据,而解密时用于解密的密

    2022年8月22日
    11
  • windows端安装eclipse导入maven工程的方法

    windows端安装eclipse导入maven工程的方法windows端安装eclipse导入maven工程的方法第一:下载并安装eclipse。下载地址:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/mars/R/eclipse-jee-mars-R-macosx-cocoa-x86_64.tar.gz第二:jdk下载并安装。下…

    2022年5月31日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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