C语言 int i=21; i = i&(~((~0)<<3)) ; printf(%d,i); 问输出什么
5个回答
展开全部
输出5。具体是这样的:
~是取反运算符,~0就表示对0取反,0的二进制表示是0000000。(int型是16位,本来是16个1的,这里就用7个表示一下,下同)对0取反就成了1111111 。(对应十进制-1)
<<是位移运算符,<<3就表示把前面的数的二进制位左移3位,根据移位规则,1111111左移3位就成了1111000了。 (对应十进制-8)
然后再对1111000取反,就成了0000111了。(对应十进制7)
到这里已经求得(~((~0)<<3))就是0000111了。
================================================
&表示按位与。i & 0000111就是:
0010101 -> i=21
0000111 ->(~((~0)<<3))=7
---------------------------------
0000101 ->5
因此,最后的结果就是5了。
~是取反运算符,~0就表示对0取反,0的二进制表示是0000000。(int型是16位,本来是16个1的,这里就用7个表示一下,下同)对0取反就成了1111111 。(对应十进制-1)
<<是位移运算符,<<3就表示把前面的数的二进制位左移3位,根据移位规则,1111111左移3位就成了1111000了。 (对应十进制-8)
然后再对1111000取反,就成了0000111了。(对应十进制7)
到这里已经求得(~((~0)<<3))就是0000111了。
================================================
&表示按位与。i & 0000111就是:
0010101 -> i=21
0000111 ->(~((~0)<<3))=7
---------------------------------
0000101 ->5
因此,最后的结果就是5了。
展开全部
输出的值为5
~为位逻辑运算符中的按位取饭。
int占用2个内存,16位
0为:0000000000000000
~0为:1111111111111111
<<为左移位运算符。将各二进制位全部向左移动三位。其余补零,溢出不管。
~0<<3:1111111111111000
继续算,继续按位取反。
~~0<<3:0000000000000111
&为按位与运算符。
21的二进制:0000000000010101
0000000000000111
所以运算结果。0000000000000101
所以结果为5
~为位逻辑运算符中的按位取饭。
int占用2个内存,16位
0为:0000000000000000
~0为:1111111111111111
<<为左移位运算符。将各二进制位全部向左移动三位。其余补零,溢出不管。
~0<<3:1111111111111000
继续算,继续按位取反。
~~0<<3:0000000000000111
&为按位与运算符。
21的二进制:0000000000010101
0000000000000111
所以运算结果。0000000000000101
所以结果为5
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
答案是 5
程序printf("%d", i);
忘了双引号 " "
程序printf("%d", i);
忘了双引号 " "
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这种问题自己运行就知道了啦
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
5
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询