#include <stdio.h>
void showbits(unsigned int x)
{
int i;
for(i=(sizeof(int)*8)-1; i>=0; i--)
(x&(1<<i))?putchar('1'):putchar('0');
printf("\n");
}
int main()
{
int j = 5225, m, n;
printf("The decimal %d is equal to binary - ", j);
/* assume we have a function that prints a binary string when given
a decimal integer
*/
showbits(j);
/* the loop for right shift operation */
for ( m = 0; m <= 5; m++ ) {
n = j >> m;
printf("%d right shift %d gives ", j, m);
showbits(n);
}
return 0;
}
请详细解释。就像它为什么写1<<i
而不是i>>1
???
如何评估各种二进制数的条件???
答案 0 :(得分:1)
表达式x << y
表示“x
向左移动y
位数”。 1 << i
将返回一个整数,其中位i
设置为1,所有其他位设置为0。
i >> 1
意味着“将i
向右移动一位”。它们根本不是可比较的操作。假设i
为5:{ {1}}将返回二进制数1 << i
或32,而00100000
将返回二进制数i >> 1
或2。)
00000010
将对x & (1 << i)
和x
执行按位AND运算,相当于检查1 << i
是否将x
位设置为1。如果是是的,这将返回一个正数;如果没有,它将返回0。
因此,如果i
将位1
设置为1,则此表达式的整体结果将打印字符x
,如果不是,则打印i
。
答案 1 :(得分:0)
作者使用了三元运算符?:而不是if-then-else,它会更清晰地通信。
1<<i
是1位移位到更高的重要性,例如i = 3:0001b
变为1000b
。
然后使用该移位的设置位来测试该位位置x
中的位。
如果x
中的该位为1,则计算第一个putchar,否则计算第二个。
答案 2 :(得分:0)
为什么写成
1<<i
而不是i>>1
???
1 << i
表示:将位1
左移位n次。因此,该位设置在位置0,然后移位i
的值指示的频率。每个连续的移位操作构成乘以2。
i>>1
这是一个完全不同的操作,因为它将位右移并且操作符被反转,因此这意味着shift the value in i right for one position
。这实际上是2的划分。
这些位移操作扫描用于某些特定事物。例如,它们用于已知数字的int的快速乘法/除法,因为这些操作比对寄存器大小的值执行FPU操作更快。
另一种用法是将各个位保留在一个字节中并屏蔽它们以测试它们是否已设置,或者是否要设置它们。在较旧的时代,这通常用于保存内存(当内存很小且很昂贵时)。它仍然需要在硬件设备上,因为你经常有硬件寄存器用信号通知各个位的各种状态。
答案 3 :(得分:0)
它只是将x的bitpattern输出到屏幕,但是按相反的顺序,这意味着,例如, x为char
和x == 5
,然后打印:10100000
(而不是00000101)。它由1<<i
而非1>>i
完成,无需将i
设置为最重要的位,具体取决于x
的类型。
但你可以写:
( x & (1<<(sizeof(x)*8-1-i)) ) ? putchar('1') : putchar('0');
然后你会以正确的顺序拥有它。