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)
上一篇 2022年10月4日 下午7:00
下一篇 2022年10月4日 下午7:16


相关推荐

  • java中折半查找思想_java折半查找法

    java中折半查找思想_java折半查找法折半查找法是效率较高的一种查找方法 假设有已经按照从小到大的顺序排列好的五个整数 a0 a4 要查找的数是 X 其基本思想是 设查找数据的范围下限为 l 1 上限为 h 5 求中点 m l h 2 用 X 与中点元素 am 比较 若 X 等于 am 即找到 停止查找 否则 若 X 大于 am 替换下限 l m 1 到下半段继续查找 若 X 小于 am 换上限 h m 1 到上半段继续查找 如此重复前面的过程直到找到或者 l gt h

    2026年3月17日
    2
  • 笛卡尔心形函数表达式_笛卡尔心形曲线[通俗易懂]

    笛卡尔心形函数表达式_笛卡尔心形曲线[通俗易懂]1650年,斯德哥尔摩的街头,52岁的笛卡尔邂逅了18岁的瑞典公主克里斯汀。那时,落魄、一文不名的笛卡尔过着乞讨的生活,全部的财产只有身上穿的破破烂烂的衣服和随身所带的几本数学书籍。生性清高的笛卡尔从来不开口请求路人施舍,他只是默默地低头在纸上写写画画,潜心于他的数学世界。一个宁静的午后,笛卡尔照例坐在街头,沐浴在阳光中研究数学问题。他如此沉溺于数学世界,身边过往的人群,喧闹的车马队伍。都无法对他…

    2022年10月17日
    4
  • 网络编程初识和socket套接字[通俗易懂]

    网络的产生不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络软件开发架构软件开发架构的类型:应用类、web类应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌

    2022年3月29日
    86
  • opkg[通俗易懂]

    opkg[通俗易懂]opkg是个安装器,小巧,功能全。root@hbg:/#opkgfilesopkgPackageopkg(9c97d5ecd795709c8584e972bfdf3aee3a5b846d-7)isinstalledonrootandhasthefollowingfiles:/bin/opkg–命令存放地/etc/opkg.conf…

    2022年4月28日
    82
  • npn饱和截止放大怎么判断_二极管饱和状态

    npn饱和截止放大怎么判断_二极管饱和状态幼儿园水平理解三极管截止、放大和饱和状态!书上看不懂,听课听不懂的过来!绕不开的三极管结构以NPN为例,晶体三极管的结构,这是很多人不想看的,但是确实是非常重要的!不看结构是理解不了工作原理的!(这样记忆:N是negative,负,代表多子为电子;P是positive,正,代表多子为空穴)注意观察三极管的结构,有助于理解工作时的状态。两张图结合起来看,略作解释:1.图中空心为空穴带正…

    2025年10月19日
    8
  • opencv行人检测python_19年赚钱新思路

    opencv行人检测python_19年赚钱新思路CVPR2019行人检测新思路:高级语义特征检测取得精度新突破原创: CV君 我爱计算机视觉 今天点击我爱计算机视觉置顶或标星,更快获取CVML新技术今天跟大家

    2022年8月5日
    13

发表回复

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

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