c语言:位运算符「建议收藏」

c语言:位运算符「建议收藏」简介位运算符用来对二进制位进行操作,Java中提供了如下表所示的位运算符:位运算符中,除~以外,其余均为二元运算符。操作数只能为整型和字符型数据。C语言中六种位运算符:&按位与|按位或^按位异或~取反>>右移<<左移运算方法按位与运算按位与运算符”&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。位运算.

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

Jetbrains全系列IDE稳定放心使用

简介

位运算符用来对二进制位进行操作,Java中提供了如下表所示的位运算符:位运算符中,除 ~ 以外,其余均为二元运算符。

操作数只能为整型和字符型数据。

C语言中六种位运算符:

& 按位与

| 按位或

^ 按位异或

~取反

>>右移

<<左移

运算方法

按位与运算

按位与运算符”&”是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

c语言:位运算符「建议收藏」 

位运算符

例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。 按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。

1

2

3

4

5

6

main()

{

    int a=9,b=5,c;

    c=a&b;

    printf(“a=%d\nb=%d\nc=%d\n”,a,b,c);

}

按位或运算

按位或运算符“|”是双目运算符。 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

例如:

1

9|5

可写算式如下:

1

2

3

4

 00001001

 |

 00000101

=00001101

(十进制为13)可见9|5=13

1

2

3

4

5

6

main()

{

    int a=9,b=5,c;

    c=a|b;

    printf(“a=%d\nb=%d\nc=%d\n”,a,b,c);

}

按位异或运算

按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。

参与运算数仍以补码出现。

例如

1

9^5

可写成算式如下:

1

2

3

4

 00001001

 ^

 00000101

=00001100

(十进制为12)

1

2

3

4

5

6

main()

{

    int a=9;

    a=a^15;

    printf(“a=%d\n”,a);

}

求反运算

求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。

例如

1

的求反运算为:

1

~(1001)

结果为:

1

0110

左移运算

左移运算符,是双目运算符。左移n位就是乘以2的n次方。 其功能把,左边的运算数的各二进位全部左移若干位,由,右边的数指定移动的位数,高位丢弃,低位补0。

1.例: a

2.例: int i = 1; i = i

c语言:位运算符「建议收藏」

 

位运算符

需要注意的一个问题是:int类型最左端的符号位和移位移出去的情况. 我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出, 例如: int i = 0x40000000; //16进制的40000000,为2进制的01000000…0000 i = i

在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0. 左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如: int i = 1, j = 0x80000000; //设int为32位 i = i

总之左移就是: 丢弃最高位,0补最低位

右移运算

右移运算符,是双目运算符。右移n位就是除以2的n次方

其功能是把,左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

例如:设 a=15,a>>2 表示把00001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。

右移对符号位的处理和左移不同: 对于有符号整数来说,比如int类型,右移会保持符号位不变,

例如: int i = 0x80000000; i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000 就是说,对于有符号数, 符号位向右移动后,正数的话补0,负数补1, 对于有符号数,在右移时,符号位将随同移动: 当为正数时, 最高位补0, 而为负数时,符号位为1, 也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位. 最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。 负数10100110 >>5(假设字长为8位),则得到的是 11111101 总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效

率高很多.

1

2

3

4

5

6

x>>1;//相当于x/=2

x<<1;//相当于x*=2

x>>2;//x/=4

x<<2;//x*=4

x>>3;//x/=8

x<<3;//x*=8

以此类推. 无符号:

1

2

3

4

5

6

7

8

9

10

main()

{

unsigned a,b;

printf(“input a number:”);

scanf(“%d”,&a);

b=a>>5;

b=b&15;

printf(“a=%d\tb=%d\n”,a,b);

}

请再看一例!

1

2

3

4

5

6

7

8

9

10

main()

{

    char a=’a’,b=’b’;

    int p,c,d;

    p=a;

    p=(p<<8)|b;

    d=p&0xff;

    c=(p&0xff00)>>8;

    printf(“a=%d\nb=%d\nc=%d\nd=%d\n”,a,b,c,d);

}

应用

举例

判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数

取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1

将int型变量a的第k位清0,即a=a&~(1

将int型变量a的第k位置1, 即a=a|(1

int型变量循环左移k次,即a=a16-k (设sizeof(int)=16)

int型变量a循环右移k次,即a=a>>k|a

优点

C 语言位运算符在某些编程中如果灵活应用,则可以大大提高程序的执行效率,使程序执行时速度更高。 [1] 

而C 语言主要应用于嵌入式开发、智能电器、通信行业等一些对效率和时间都要求很高的应用领域中,学好位运算符,在程序开发中灵活应用位运算符,往往能在这些应用中起到事半功倍的效果。

注意事项

位运算符使用的注意事项: [2] 

(1) 位运算是对字节或字中的实际二进制位进行检测、设置或移位,它只适用于字符型和整数型变量以及它们的变体,对其它数据类型不适用。

(2)关系运算和逻辑运算表达式的结果只能是1 或0,而位运算的结果可以取0 或1 以外的值。

(3)要注意区别位运算符和逻辑运算符的不同。

来自 <https://baike.baidu.com/item/%E4%BD%8D%E8%BF%90%E7%AE%97%E7%AC%A6/2786163>

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hive是一个数据仓库基础架构_数据仓库ods层和dw层的区别

    hive是一个数据仓库基础架构_数据仓库ods层和dw层的区别软件环境Hadoop2.6.0-cdh5.9.0Hive1.1.0-cdh5.9.0Zookeeper3.4.5-cdh5.9.0需求背景数据来源是将8台服务器日志各自压缩成*.gz(8个gz文件)后,按天和小时分区传入到HDFS上,然后通过创建HiveODS外部表加载到表对应分区,这样一天下来会生产192个gz文件,gz文件是不能进行切分所以查询一天则会产生192

    2022年9月27日
    0
  • pycharm安装使用教程_vcenter安装

    pycharm安装使用教程_vcenter安装1.PyCharm介绍PyCharm是一种PythonIDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如,调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。同时支持GoogleAppEngine,更酷的是,PyCharm支持IronPython!这些功能在先进代码分析程序的支持下,使PyCharm成为Python专业开发人员和刚起步人员使

    2022年8月27日
    0
  • 2020/7/7学习记录

    2020/7/7学习记录1.微信小程序text内容显示空格<text decode=”{{true}}”space=”{{true}}”>报名人数&nbsp;</text>decode=”{{true}}”space=”{{true}}2.

    2022年8月18日
    5
  • C语言实现推箱子游戏

    C语言实现推箱子游戏很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~一、介绍开发语言:C语言开发工具:Dev-C++5.11日期:2019年9月28日作者:ZackSock也不说太多多余的话了,先看一下效果图:游戏中的人物、箱子、墙壁、球都是字符构成的。通过wasd键移动,规则的话就是推箱子的规则,也就不多说了。二、代…

    2022年5月18日
    31
  • open函数打开文件方式

    open函数打开文件方式r:以只读方式打开文件。文件的指针将会放在文件的开头。这是**默认模式**。rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。r+:打开一个文件用于读写。文件指针将会放在文件的开头。rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。w:打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。.

    2022年5月9日
    87
  • 史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)

    史上最简单的SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)简介在分布式系统中,springcloudconfig提供一个服务端和客户端去提供可扩展的配置服务。我们可用用配置服务中心区集中的管理所有的服务的各种环境配置文件。配置服务中心采用git的方式存储配置文件,因此我们很容易部署修改,有助于对环境配置进行版本管理。

    2022年6月1日
    47

发表回复

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

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