ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 如何设置,清除和切换一个位?

2019-09-11 00:13:36  阅读:243  来源: 互联网

标签:c-3 c bitwise-operators bit-manipulation


如何设置,清除和切换C/C++?

解决方法:

设置一下

使用按位OR运算符(|)设置位.

number |= 1UL << n;

这将设置第n位数. n应该为零,如果要设置第1位,依此类推至n-1,如果要设置第n位.

如果数字宽于无符号长,则使用1ULL;促进1UL<< n在评估1UL<<< n,它的未定义行为要超过长度的宽度.这同样适用于所有其他示例. 清理一下 使用按位AND运算符(&)清除一下.

number &= ~(1UL << n);

这将清除数字的第n位.必须使用按位NOT运算符(〜)反转位串,然后运行AND.

切换了一下

XOR运算符(^)可用于切换位.

number ^= 1UL << n;

这将切换数字的第n位.

检查一下

你没有要求这个,但我不妨补充一下.

要检查一下,将数字n向右移动,然后按位向右移动:

bit = (number >> n) & 1U;

这将把数字的第n位的值放入变量位.

将第n位更改为x

将第n位设置为1或0可以通过以下2的补码C实现来实现:

number ^= (-x ^ number) & (1UL << n);

如果x为1,则将设置位n,如果x为0,则清除位.如果x具有其他值,则会产生垃圾. x = !! x将其布尔化为0或1.

为了使其独立于2的补码否定行为(其中-1设置了所有位,与1的补码或符号/幅度C实现不同),使用无符号否定.

number ^= (-(unsigned long)x ^ number) & (1UL << n);

要么

unsigned long newbit = !!x;    // Also booleanize to force 0 or 1
number ^= (-newbit ^ number) & (1UL << n);

使用无符号类型进行便携式位操作通常是个好主意.

要么

number = (number & ~(1UL << n)) | (x << n);

(number&〜(1UL<< n))将清除第n位,并且(x << n)将第n位设置为x. 一般来说,通常不要复制/粘贴代码也是一个好主意,因此很多人使用预处理器宏(如the community wiki answer further down)或某种封装.

标签:c-3,c,bitwise-operators,bit-manipulation
来源: https://codeday.me/bug/20190910/1802227.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有