2011-09-03 124 views
2

所以我有一个问题,我的班,我有麻烦开始。我不是要求人们为我解决问题,我只是想向正确的方向推动。我需要在C中创建一个函数,当给定任何32位整数时,它返回一个整数,其中每个第4位设置为从最小sig位开始的1。我明白到底它应该是什么样子,但是开始我迷失了方向。我们不允许使用任何for循环或条件,只是标准的按位和逻辑运算符(!〜&^| + < < >>)。再一次,我没有要求任何人为我做这件事,我只想帮助我思考正确的道路。我在这里和其他网页上看到了其他一些帖子,但似乎没有人点击。我知道你可以将1移到某个特定的地方,但除此之外,我被卡住了。任何帮助,将不胜感激。帮助开始分配特定位

回答

0

结账bitmasking

... 因此,要确保一点上,也可以用1来退出一点不变,或使用一个0

所以掩盖你的情况下(而其它位不变)将是:

二进制:10001000100010001000100010001000 十六进制:88888888

1

你能写下来(十六进制)的32位整数,其中的每第4位设为1,所有其他位设为0?

现在,是否有一个操作可以应用于您的输入和这个幻数,它将输入的每个第4位设置为1,而是让其他位保持独立?

2
int get_int_with_every_fourth_bit_set() 
{ 
    return 0x88888888; 
} 

好吧,那大部分都是非常有趣的。这是一个什么样的位运算符做一个列表:

  • 位NOT(~):切换位,0比1和1比0
  • AND(&):设置一个位,如果在该位置的位在两个操作数
  • OR被设置(|):如果在该位置的比特中任一操作数被设定设定位
  • XOR(^):如果在该位置正好一个位被设置在两者之间设定位操作数
  • 按位移(<<>>):在指定的方向上移动指定量的每一位。当左移时,零被添加到最低有效位。右移时,如果该值为无符号或正值,则将添加零。

这里有一些按位技巧,好知道:

按比特移位由一个离开相同乘以2。按位向右移动与按2分割相同,并向下舍入。

两个的所有幂只有一个1位。要看到,如果一个数是2的幂,你可以这样做:

return !(x & (x - 1)) && x

举个例子,说x = 16,这是两个电源。然后,x - 1 = 15,所以要进行与运算的值是0001000000001111。由于每个位的位置在两个操作数中的至少一个中具有零,所以结果为零。 !0为真,因此请检查x != 0。由于16 != 0,该语句返回true。如果您使用不是2的幂而不是0的数字进行尝试,则x & (x - 1)检查将始终为真。非常酷!

另一个秘诀:因为0^0 = 01^1 = 0,您可以使用XOR看什么位有变化。例如,如果您有两个字节并且希望看到之间发生变化的位,则两个字节的异或将在所有已更改位的位置上给出1。

+0

也许OP在寻找'a_32bit_int | 0x88888888'? –

+0

对不起,不知道这个问题已经过去了几年... –