按位逻辑运算符和移位运算符
Bitwise logical operator and shift operator
此代码是书中的示例,该问题需要使用按位 AND
运算符和 shift
运算符将十进制数转换为二进制数。
我无法理解代码,尽管我曾尝试使用调试编译器来理解这段代码。
假设 a
和 b
的用户输入是 10
和 8
#include <stdio.h>
#include <stdlib.h>
int count_bits (unsigned x)
{
int bits=0;
while(x){
if (x&1U)bits++;
x>>=1;
} return bits;
}
int int_bits(void)
{
return count_bits(~0U);
}
void print_bits(unsigned x)
{
int i;
for(i=int_bits(x)-1;i>=0;i--)
putchar(((x>>i)&1U)?'1':'0');
}
int main(void)
{
unsigned a,b; /*suppose user input a=10 b=8*/
printf("enter two positive integer value=\n");
printf("a= "); scanf("%u",&a);
printf("b: "); scanf("%u",&b);
printf("\na ="); print_bits(a);
printf("\na ="); print_bits(b);
return 0;
}
在 int_bits
函数中 (~0U)
实际上做了什么?我的意思是将 0
更改为 1
?
我知道它调用 count_bits
函数和 return 计数位 (~0) 值,但为什么这里的 x
有点像 4294967295
的随机内存地址?
可能是因为 int int_bits(void)
和 int_bits()
所以没有参数和 x
从 10
更改为随机地址?
而count_bits
函数是用来计算多少位的?
while (4294967295) {
if(x&1u)-> (means compare x last digit value with 1) if true, bits ++;
x>>=1; }-> this mean to shift 1 digit of x to right which mean to divide with 2 until quotien is 0
当我尝试调试时,我得到了 32
位值
为什么要生产32
?这是否与 (~0U)
有关,所以所有位都是 1
或除法的剩余部分?
print_bits (unsigned x) function, is to produce the result
for(i=int_bits()-1;i>=0;i--)
putchar(((x>>i)&1u)?'1':'0')
the x in this value is 10,8 (user input)
and i is 31 from return bits
32-1=31 will be looping until 0
10>>30
表示将 31
右移 10
?
如何产生1010
?
这段代码实际比较产生了什么 1010
?
实际上程序也产生了 32
数字,最后是 1010
。
print_bits(unsigned x):
代码使用& 1u
取十进制数的最后一位(与& 0000000000000001
相同),然后使用三元运算符放一个'1'
如果最后一位是1
(true) 和 0
如果最后一位是 0
(false)。该数字也在每一步中再右移一位(由于 i
递增),以便通过使用 & 1u
.
获得每一位
&
(和)运算符比较两个数字中的每个对应位,如果有两个 1
,则创建 1
位,如果有两个 0
在所有其他情况下。
这个:
int i = (0101/**/0111) & (0010/**/0101);
会给 i
一个这样的值:
0000/**/0000/**/0000/**/0101 // The addition of two sets of 4 0's on the
//left was due to me assuming int is 32 bits in your system.
右移 1
(>> 1
):
1101
会产生这个:
0110
多次移位允许三元语句检查所有位。
count_bits (unsigned x):
计算x
的最低位是否为1
,同时递增
bits,存储位数。 x
仅在 x
为 1
时才右移,
从而使 x
中的所有 1
都设置为 0
(我只想
每次迭代都将 x
右移(结果相同)。
int_bits(void) 将 count_bits 中的所有 0 转换为 1,以便循环知道何时停止
此代码是书中的示例,该问题需要使用按位 AND
运算符和 shift
运算符将十进制数转换为二进制数。
我无法理解代码,尽管我曾尝试使用调试编译器来理解这段代码。
假设 a
和 b
的用户输入是 10
和 8
#include <stdio.h>
#include <stdlib.h>
int count_bits (unsigned x)
{
int bits=0;
while(x){
if (x&1U)bits++;
x>>=1;
} return bits;
}
int int_bits(void)
{
return count_bits(~0U);
}
void print_bits(unsigned x)
{
int i;
for(i=int_bits(x)-1;i>=0;i--)
putchar(((x>>i)&1U)?'1':'0');
}
int main(void)
{
unsigned a,b; /*suppose user input a=10 b=8*/
printf("enter two positive integer value=\n");
printf("a= "); scanf("%u",&a);
printf("b: "); scanf("%u",&b);
printf("\na ="); print_bits(a);
printf("\na ="); print_bits(b);
return 0;
}
在 int_bits
函数中 (~0U)
实际上做了什么?我的意思是将 0
更改为 1
?
我知道它调用 count_bits
函数和 return 计数位 (~0) 值,但为什么这里的 x
有点像 4294967295
的随机内存地址?
可能是因为 int int_bits(void)
和 int_bits()
所以没有参数和 x
从 10
更改为随机地址?
而count_bits
函数是用来计算多少位的?
while (4294967295) {
if(x&1u)-> (means compare x last digit value with 1) if true, bits ++;
x>>=1; }-> this mean to shift 1 digit of x to right which mean to divide with 2 until quotien is 0
当我尝试调试时,我得到了 32
位值
为什么要生产32
?这是否与 (~0U)
有关,所以所有位都是 1
或除法的剩余部分?
print_bits (unsigned x) function, is to produce the result
for(i=int_bits()-1;i>=0;i--)
putchar(((x>>i)&1u)?'1':'0')
the x in this value is 10,8 (user input)
and i is 31 from return bits
32-1=31 will be looping until 0
10>>30
表示将 31
右移 10
?
如何产生1010
?
这段代码实际比较产生了什么 1010
?
实际上程序也产生了 32
数字,最后是 1010
。
print_bits(unsigned x):
代码使用& 1u
取十进制数的最后一位(与& 0000000000000001
相同),然后使用三元运算符放一个'1'
如果最后一位是1
(true) 和 0
如果最后一位是 0
(false)。该数字也在每一步中再右移一位(由于 i
递增),以便通过使用 & 1u
.
&
(和)运算符比较两个数字中的每个对应位,如果有两个 1
,则创建 1
位,如果有两个 0
在所有其他情况下。
这个:
int i = (0101/**/0111) & (0010/**/0101);
会给 i
一个这样的值:
0000/**/0000/**/0000/**/0101 // The addition of two sets of 4 0's on the
//left was due to me assuming int is 32 bits in your system.
右移 1
(>> 1
):
1101
会产生这个:
0110
多次移位允许三元语句检查所有位。
count_bits (unsigned x):
计算x
的最低位是否为1
,同时递增
bits,存储位数。 x
仅在 x
为 1
时才右移,
从而使 x
中的所有 1
都设置为 0
(我只想
每次迭代都将 x
右移(结果相同)。
int_bits(void) 将 count_bits 中的所有 0 转换为 1,以便循环知道何时停止