C - 将所有偶数位设置为 1 的方法
C - Method for setting all even-numbered bits to 1
我负责编写一个方法,"returns the word with all even-numbered bits set to 1." 对 C 来说是全新的,这看起来确实令人困惑和不清楚。我不明白如何用 C 更改数字的位。这似乎是一个非常低级的指令,我什至不知道如何用 Java(我的母语)来做到这一点!有人可以帮帮我吗!这是方法签名。
int evenBits(void){
return 0;
}
任何有关如何执行此操作的说明,甚至有关如何开始执行此操作的指导,将不胜感激。非常感谢!
把它分解成两个问题。
(1) 给定一个变量,如何设置特定位?
提示:使用按位运算符。
(2) 如何找到 "all even-numbered bits" 的表示形式以便我可以使用按位运算符来设置它们?
提示:使用数学。 ;-) 您可以制作一个 table(或找到一个),例如:
Decimal | Binary
--------+-------
0 | 0
1 | 1
2 | 10
3 | 11
... | ...
一旦您知道使用什么操作来设置特定位,并且知道在 C 中使用它的十进制(或十六进制)整数文字,您就解决了问题。
您必须给出所有偶数位的精确定义。在不同的体系结构上,位以不同的方式编号。硬件人员喜欢从 1
到 32
从最低有效位到最高有效位,或者有时相反,从最高有效位到最低有效位……而软件人员喜欢从 0
开始按递增顺序对位进行编号,因为位 0
表示数字 20,即:1.
使用后一种编号系统,位模式将是 0101...0101
,因此是十六进制值 0x555...555
。如果您从 1 开始为最低有效位编号,则模式将为 1010...1010
,十六进制 0xAAA...AAA
。但这种表示实际上在当前架构上编码了一个负值。
对于这个答案的其余部分,我假设偶数位是表示 2 的偶数次方的位:1
(20), 4
(22), 16
(24)...
这个问题的简短答案是:
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 标准允许在一个或多个无效的情况下实现。
所以基本上每隔一位都必须设置为 1?这就是我们在 C 中进行按位运算的原因。想象一下常规位数组。你想要的是最右边的偶数位并将其设置为 1(这是数字 2)。然后我们只需使用 OR 运算符 (|) 来修改我们现有的数字。这样做之后。我们将数字向左移动 2 位 (<< 2),与之前的 0010 相比,这会将位数组修改为 1000。然后我们再次执行相同操作并使用 or 运算符。下面的代码描述得更好。
#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;
}
这里是link到Bitwise Operations in C
我负责编写一个方法,"returns the word with all even-numbered bits set to 1." 对 C 来说是全新的,这看起来确实令人困惑和不清楚。我不明白如何用 C 更改数字的位。这似乎是一个非常低级的指令,我什至不知道如何用 Java(我的母语)来做到这一点!有人可以帮帮我吗!这是方法签名。
int evenBits(void){
return 0;
}
任何有关如何执行此操作的说明,甚至有关如何开始执行此操作的指导,将不胜感激。非常感谢!
把它分解成两个问题。
(1) 给定一个变量,如何设置特定位?
提示:使用按位运算符。
(2) 如何找到 "all even-numbered bits" 的表示形式以便我可以使用按位运算符来设置它们?
提示:使用数学。 ;-) 您可以制作一个 table(或找到一个),例如:
Decimal | Binary
--------+-------
0 | 0
1 | 1
2 | 10
3 | 11
... | ...
一旦您知道使用什么操作来设置特定位,并且知道在 C 中使用它的十进制(或十六进制)整数文字,您就解决了问题。
您必须给出所有偶数位的精确定义。在不同的体系结构上,位以不同的方式编号。硬件人员喜欢从 1
到 32
从最低有效位到最高有效位,或者有时相反,从最高有效位到最低有效位……而软件人员喜欢从 0
开始按递增顺序对位进行编号,因为位 0
表示数字 20,即:1.
使用后一种编号系统,位模式将是 0101...0101
,因此是十六进制值 0x555...555
。如果您从 1 开始为最低有效位编号,则模式将为 1010...1010
,十六进制 0xAAA...AAA
。但这种表示实际上在当前架构上编码了一个负值。
对于这个答案的其余部分,我假设偶数位是表示 2 的偶数次方的位:1
(20), 4
(22), 16
(24)...
这个问题的简短答案是:
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 标准允许在一个或多个无效的情况下实现。
所以基本上每隔一位都必须设置为 1?这就是我们在 C 中进行按位运算的原因。想象一下常规位数组。你想要的是最右边的偶数位并将其设置为 1(这是数字 2)。然后我们只需使用 OR 运算符 (|) 来修改我们现有的数字。这样做之后。我们将数字向左移动 2 位 (<< 2),与之前的 0010 相比,这会将位数组修改为 1000。然后我们再次执行相同操作并使用 or 运算符。下面的代码描述得更好。
#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;
}
这里是link到Bitwise Operations in C