首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是"(int)值& 0x1,(int)值& 0x2,(int)值& 0x4,(int)值& 0x8“?

什么是"(int)值& 0x1,(int)值& 0x2,(int)值& 0x4,(int)值& 0x8“?
EN

Software Engineering用户
提问于 2014-07-02 08:31:19
回答 3查看 47.2K关注 0票数 11

“值”从0到15 (它的可能值)。这4个“如果”条件何时才能得到满足?如果我的(Int)值=2,这是否意味着0010?

代码语言:javascript
运行
复制
            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }
EN

回答 3

Software Engineering用户

发布于 2014-07-02 10:51:40

每个数字可以表示为value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...,每个b要么是0,要么是1 (这些是表示的位)。这是二进制表示。

二进制和(&)明智地接收每个b对,并对它们执行和执行。这方面的产出如下:

代码语言:javascript
运行
复制
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

使用2的幂(只有一位),我们可以隔离和测试各个位:

  • value & 1为奇数{1,3,5,7,9,11,13,15}时,value为真。
  • value & 2为奇数{2,3,6,7,10,11,14 ,15}时,value/2为真。
  • value & 4为奇数{4,5,6,7,12,13,14 ,15}时,value/4为真。
  • value & 8是奇数{8,9,10,11,12,13,14 ,15}时,value/8为真。

数字上的0x prefex意味着它应该被解释为十六进制数。当您只使用0x8但告诉维护人员它可能被用作位掩码时,它就有点多余了。

票数 12
EN

Software Engineering用户

发布于 2014-07-02 13:13:28

这些if语句检查是否设置了特定的value位。

例如,十六进制值0x4的第三个位从右设置为1,所有其他位设置为0。当您使用带有两个操作项的二进制和操作符(&)时,结果将将所有位设置为0,除了在这两个操作项中为1的位。

因此,在计算value & 0x4时,您可以得到二进制00000000或二进制00000100,这取决于value的第三位是1还是0。第一个计算结果为false,第二个计算值为true,因此if-块只对设置了第3位的值执行。

票数 5
EN

Software Engineering用户

发布于 2014-07-02 14:18:00

这里有两件有趣的事情要注意。

首先,这是一个用于检查积分值的每一个低阶4位的通用模式。如果设置了相应的位,则满足if条件。对于值2,位模式确实是0010。

另一个更有趣的问题是为什么会出现(int)?除了在C++中使用C-类型的糟糕样式之外,没有任何整数或字符值需要这种转换。bool没有任何意义,双重/浮点数将被转换为一个临时整数,使用文字值来测试枚举是很不寻常的。用指针可能是有意义的,但这将是一个非常特殊的用途。结论:石膏没有任何意义。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/246639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档