2012-08-09 74 views
4

可能重复:
How do you set, clear and toggle a single bit in C?位操作功能

我对即将到来的最后学习,我想验证从学习指南的一些问题。

一些上下文:

  • Set()函数设置在一个字节1

  • Unset()功能的位设置在一个字节为0

  • Flip()功能“有点翻转“位到相反的位置

所以我们班的一些孩子自己回答了学习指导的问题,但我已经发现了一些错误,而这些答案听起来很腥。以下是他所说的:

Set的哪个操作?或运营商|

Unset使用哪种操作? XOR操作员^完成两次

Flip使用哪种操作?异或运算符^

这些是我在上面描述的函数中实现的正确的按位运算符吗?

+2

第二个是不正确的 - 第一和第三是OK。想想看 - 翻转(翻转)两次不会解除它。 – 2012-08-09 13:34:59

+3

...并且如该问题所示,请在提问前进行一些搜索。 Paul指出的重复只是网络上这个问题的一种可能的资源。 – 2012-08-09 14:24:32

回答

2

你是对的第一个,但对于Unset()你应该在该位使用&并使用0

+2

例如:取消设置第5位'x&〜(1 << 5)' – Esailija 2012-08-09 13:37:36

0
00000000 | 
    00000001 = 
-------------- 
    00000001 // Sets 

    00000001 & 
    00000000 = 
-------------- 
    00000000 // Unsets 

    00000001^
    00000001 = 
-------------- 
    00000000 // Flips 

如果bit是位在字节要被操纵:

x |= (1 << bit); // Sets 
x &= ~(1 << bit); // Unsets 00000001 becomes 11111110. 
x ^= (1 << bit); // Flips 
+1

您的第二位取消所有位 – Esailija 2012-08-09 13:43:54

+0

@Esailija:是的,我要改变这个 – 2012-08-09 13:49:13

0

用于在数x第n位...

int Set(x, n){ 
    return x | (1 << n); 
} 

int Unset(x, n){ 
    return (x^(1 << n))^(1 << n); 
} 

int Flip(x, n){ 
    return x^(1 << n); 
} 
+0

Unset执行不正确 - 反转一下两次不清除它 – 2012-08-09 15:34:11

+0

哦,快点!你是对的!它应该是x&〜(1 << n)! – 2012-08-09 16:40:40