我负责编写一个方法,该方法“返回所有偶数位设置为1的字。”对C来说是全新的,这似乎令人困惑和不清楚。我不明白我怎么能用C改变一个数字的位。这看起来像一个非常低级别的指令,我甚至不知道如何用Java(我的第一语言)做到这一点!有人可以帮帮我吗!这是方法签名。
int evenBits(void){
return 0;
}
任何有关如何执行此操作的说明,甚至是如何开始这样做的指导都将非常感激。非常感谢你!
答案 0 :(得分:1)
将其分解为两个问题。
(1)给定变量,如何设置特定位?
提示:使用按位运算符。
(2)如何找出“所有偶数位”的表示,以便我可以使用按位运算符来设置它们?
提示:使用数学。 ;-)你可以创建一个表(或找到一个),如:
Decimal | Binary
--------+-------
0 | 0
1 | 1
2 | 10
3 | 11
... | ...
一旦你知道用什么操作来设置特定的比特,并且你知道在C中使用它的十进制(或十六进制)整数文字,你就解决了这个问题。
答案 1 :(得分:0)
您必须准确定义所有偶数位。位在不同的体系结构上以不同的方式编号。硬件人员喜欢将它们从最低有效位到最高有效位从1
到32
进行编号,或者有时从最重要位到最低位进行编号...而软件人员喜欢通过增加从0
开始的顺序来对位进行编号,因为位0
表示数字2 0 ,即:1。
使用后一种编号系统,位模式为0101...0101
,因此为十六进制0x555...555
的值。如果您为最低有效位编号从1开始的位数,则模式为1010...1010
,格式为十六进制0xAAA...AAA
。但是这种表示实际上编码了当前架构的负值。
对于本答案的其余部分,我将假设偶数位是表示2的偶数幂的位:1
(2 0 ),4
(2 2 ),16
(2 4 )...
这个问题的简短答案是:
int evenBits(void) {
return 0x55555555;
}
但如果int
有64位呢?
int evenBits(void) {
return 0x5555555555555555;
}
将处理64位int
,但在int
较小的系统上会有实现定义的行为。
使用来自<limits.h>
的宏,您可以屏蔽额外的位以处理16位,32位和64位的整数:
#include <limits.h>
int evenBits(void) {
return 0x5555555555555555 & INT_MAX;
}
但是这段代码仍然有一些假设:
int
最多有64位。int
的位数是偶数。INT_MAX
是2减1的幂。这些假设对大多数当前系统都有效,但C标准允许实现一个或多个无效的实现。
答案 2 :(得分:0)
所以基本上所有其他位都必须设置为1?这就是我们在C中进行按位操作的原因。想象一下常规的比特阵。你想要的是最合适的位,并将其设置为1(这是数字2)。然后我们只使用OR运算符(|)来修改现有的数字。这样做之后。我们将位数向左移位2位(&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&lt下面的代码更好地描述了它。
#include <stdio.h>
unsigned char SetAllEvenBitsToOne(unsigned char x);
int IsAllEvenBitsOne(unsigned char x);
int main()
{
unsigned char x = 0; //char is one byte data type ie. 8 bits.
x = SetAllEvenBitsToOne(x);
int check = IsAllEvenBitsOne(x);
if(check==1)
{
printf("shit works");
}
return 0;
}
unsigned char SetAllEvenBitsToOne(unsigned char x)
{
int i=0;
unsigned char y = 2;
for(i=0; i < sizeof(char)*8/2; i++)
{
x = x | y;
y = y << 2;
}
return x;
}
int IsAllEvenBitsOne(unsigned char x)
{
unsigned char y;
for(int i=0; i<(sizeof(char)*8/2); i++)
{
y = x >> 7;
if(y > 0)
{
printf("x before: %d\t", x);
x = x << 2;
printf("x after: %d\n", x);
continue;
}
else
{
printf("Not all even bits are 1\n");
return 0;
}
}
printf("All even bits are 1\n");
return 1;
}
的链接