2 u013610563 u013610563 于 2016.03.23 10:30 提问

c语言中按位取反的问题

我想要得到111001(二进制),想通过111000与000001按位或得到,

我用~0<<3,想得到最后三位是0,其余位为1,可是结果
printf("%i\n",~0<<3)输出为-8,不明白为什么这里
虽然0取反为-1,也就是全为1的二进制序列,可左移后为什么是-8

还有如何得到最后一位为1,其余全为0的二进制,
我用
~(~0<<(sizeof(0)*8-1))得到的值特别大,根本不是1,请教一下

1个回答

qq_26714389
qq_26714389   2016.03.23 11:56

#i是有符号整数,这里的问题有两个,你应该用int8而不是完整的int32,~0左移导致的问题是符号位变1,则为负数,二进制的负数和正数读法是反过来的,你稍微理解一下就清除了,至于要得到你的结果你可以直接或一个无符号的1

qq_26714389
qq_26714389 想通过111000与000001 可以构造一个111 == 7 左移三位 后 与 1 或操作(请用无符号整数)
一年多之前 回复
qq_26714389
qq_26714389 你应该用int8而不是完整的int32 我的这句话没有任何意义,可以直接忽略,我开始理解出错了= -=
一年多之前 回复
qq_26714389
qq_26714389 ~(~0<<(sizeof(0)*8-1)) 怎么会得到1呢?你的操作结果就相当于只有符号位为0,其余为1,你想得到1就右移回去吧
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!