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


相关推荐

  • 巧用ISAPI_Rewrite规则写IIS防盗链

    巧用ISAPI_Rewrite规则写IIS防盗链巧用ISAPI_Rewrite规则写IIS防盗链关键是httpd.ini的设置首先,必须要保证httpd.ini有可写权限,设置isapi_rewrite安装文件夹IIS_来宾,IIS_进程读写权限。httpd.ini默认设置如下:RewriteCondHost:(.+)RewriteCondReferer:(?!http:///1.*).*我们在它后面加上一句Rewr

    2022年7月23日
    15
  • vue实现移动端音乐APP

    vue实现移动端音乐APP项目基于 vue2 6 使用 vue cli 搭建项目项目部分功能预览目前实现的功能发现音乐首页 侧边栏弹窗 歌单推荐 歌单详情 最新歌曲 歌曲播放 获取排行榜单 歌词同步滚动 手机号登录 手机号注册 后续还会继续完善登录与主页面的链接 验证码验证 我的音乐 视频 云村等功能 技术栈 vue cli 搭建项目 vue 构建用户界面框架 vue router 路由的实现 axios 简化异步操作 ES6 ECMAScript 新一代语法 用到了解构赋值 模块化 还有一些方法

    2026年3月17日
    2
  • Deepseek中小学生使用指南

    Deepseek中小学生使用指南

    2026年3月16日
    2
  • 实现KMO和Bartlett的球形度检验的两种方法[通俗易懂]

    实现KMO和Bartlett的球形度检验的两种方法[通俗易懂]文章目录实现KMO和Bartlett的球形度检验的两种方法SPSS实现KMO和Bartlett的球形度检验第一步:选择“因子分析”第二步:选择变量第三步:选择KMO和巴特利特球形度检验输出结果SAS实现KMO和Bartlett的球形度检验数据集来源参考资料实现KMO和Bartlett的球形度检验的两种方法SPSS实现KMO和Bartlett的球形度检验第一步:选择“因子分析”导入数据…

    2022年6月14日
    106
  • execute executeupdate_executeupdate不执行

    execute executeupdate_executeupdate不执行增、删、改用executeUpdate()返回值为int型,表示被影响的行数例子查用executeQuery()返回的是一个集合.next()表示指针先下一行,还有first()指向第一行、last()指向最后一行、如果有数据就返回true…

    2022年8月31日
    4
  • Git之创建远程分支和删除远程分支

    Git之创建远程分支和删除远程分支1 创建远程分支 browser 1 8 0 在没有创造 browser 1 8 0 之前 我们先查看下所有分支 gitbranch a 可以知道我们目前在 browser 1 7 0 分支 然后我们创建本地分支 browser 1 8 0gitbranchbr 1 8 0 再看下所有分支 gitbranch a 然后我们再切换到分支 browser 1 8 0 然后再推送到服务器 gitcheckoutb 1 8 0gitpushse

    2026年3月17日
    2

发表回复

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

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