您好我需要的学校作业问题:
读取一个圆数,并使用内部binaire代码,右边的位0和左边的位7。
现在我需要改变: 位7与位7 位6与位6 第2位,第5位 第3位,第4位
通过示例:
如果我使用十六进制F703变为F7C0 因为03 = 0000 0011,C0 = 1100 0000 (只需要切换正确的字节(8位)。 这个缺点是关于bitmanipulation,但我找不到一种方法来使16个hexnumber正确。
我现在很尴尬,
我正在考虑使用数组来解决这个问题,或者有人可以说我只能用按位^,&,〜,<<,>>,opertors ???
答案 0 :(得分:0)
基本上你需要反转位排序。 我们不会为你解决这个问题..但这里有一个暗示:
如果您有2位值,该怎么办?你会如何扭转这些位?
简单的交换会起作用,对吧?考虑如何使用可用的运算符对此交换进行编码。
现在假设您有一个4位值。你会如何扭转这些位?
你能将它分成两个2位值,反转每个值,然后交换它们吗?这会给你正确的结果吗?现在编码。
将该解决方案概括为8位值应该是微不足道的。
祝你好运!答案 1 :(得分:0)
这占了四分之一的工作,但我不会再给你任何帮助了;如果你能解释我为什么这么说,那么你应该能够填写剩下的代码。
if ((i ^ (i >> (5 - 2))) & (1 >> 2))
i ^= (1 << 2) | (1 << 5);
答案 2 :(得分:0)
研究以下两个功能:
bool GetBit(int value, int bit_position)
{
return value & (1 << bit_position);
}
void SetBit(int& value, int bit_position, bool new_bit_value)
{
if (new_bit_value)
value |= (1 << bit_position);
else
value &= ~(1 << bit_position);
}
所以现在我们可以像数组一样读写任意位。
1 << N
给你:
000...0001000...000
1位于第N位。
所以
1 << 0 == 0000...0000001
1 << 1 == 0000...0000010
1 << 2 == 0000...0000100
1 << 3 == 0000...0001000
...
等等。
如果我将上述其中一个数字与其他数字Y联系起来会发生什么?
X = 1 << N
Z = X & Y
Z会是什么样子?那么除了Nth之外的每一点肯定会是0不是吗?因为X中的这些位是0。
Z的第N位是什么?这取决于Y的第N位的值不是吗?那么在什么情况下Z为零?确切地说,当Y的第N位为0.因此,通过将Z转换为bool,我们可以分离出Y的第N位的值。再看看上面的GetBit函数,这正是它正在做的事情。
现在那是读点,我们怎么设置一下?好吧,如果我们想要设置一点,我们可以使用BINARY OR与上面的(1&lt;&lt; N&lt; N)数字之一:
X = 1 << N
Z = Y | X
Z将会在这里?那么除了Nth之外,每一点都会和Y一样吗?并且第N位总是为1.所以我们将第N位设置为开启。
将位设置为零怎么样?我们想做的是取一个像11111011111这样的数字,其中只有第N位关闭然后使用BINARY AND。要获得这样的数字,我们只使用BINARY NOT:
X = 1 << N // 000010000
W = ~X // 111101111
Z = W & Y
因此,除了Nth之外,Z中的所有位都是Y的副本.Nth将永远关闭。所以我们有效地将第N位设置为0。
使用上述两种技术是我们如何实现SetBit。
所以现在我们可以读写任意位。现在我们可以像数组那样反转数字的位:
int ReverseBits(int input)
{
int output = 0;
for (int i = 0; i < N; i++)
{
bool bit = GetBit(input, i); // read ith bit
SetBit(output, N-i-1, bit); // write (N-i-1)th bit
}
return output;
}
请确保您了解这一切。一旦你理解了这一切,请关闭页面并实施和测试它们,而不是看它。
如果您喜欢这个,请尝试其中一些:
http://graphics.stanford.edu/~seander/bithacks.html
和/或得到这本书: