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 或操作(请用无符号整数)
2 年多之前 回复
qq_26714389
qq_26714389 你应该用int8而不是完整的int32 我的这句话没有任何意义,可以直接忽略,我开始理解出错了= -=
2 年多之前 回复
qq_26714389
qq_26714389 ~(~0<<(sizeof(0)*8-1)) 怎么会得到1呢?你的操作结果就相当于只有符号位为0,其余为1,你想得到1就右移回去吧
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c语言:0的按位取反结果
0的按位取反结果是多少?#include int main(){int i = 0;int n = ~i;printf("%d\n", n);//-1return 0;}结果:-1请按任意键继续. . .注:00000000    00000000   00000000    000000001111111   11111111  11111111   11111111//在二进制里面表示-1本文
c语言的位取反和按位异或
//如果a = 2,那么二进制位 0 000 0010,~ (a)的二进制就是 1 111 1111.结果不该为-3啊,请问这个位运算符是怎么取反的啊。谢谢! #include #include int main (void) {  int a = ~(2);  printf ("%d\n",a);  //为什么结果是-3 system ("pause"); return 0;
C语言按位与 按位或 按位异或 按位取反
与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~ 1取0,0取1 ~1 = 0, ~0 = 1 ~(10001) = 01110 异或运算 两者相等为0,不等为1 1^1=0,
关于C语言中的按位与(&)按位或(|)按位异或(^)取反(~)左移(<<)右移(>>)
1 前言 本人C语言上大学没有学习好,恩确切说这个应该是属于计算机组成原理的东西,由于目前在搞IOS,学的越深,越感觉需要把C语言和数据结构学好,所以今天在次与大家分享有关C语言中的按位与(&)按位或(|)按位异或(^)取反(~)。 2 详述 由于这些运算符号都是基于二进制来说的,所以十进制的计算都需要转换成二进制。下面我们就来介绍一下二进制和十进制之间的转换: 2.1 二进制转十进制
!和~的区别(逻辑取反和按位取反)
在c语言中,!和~均表示取反,这两个的区别在于: 1. ! :代表逻辑取反,即:把非0的数值变为0,0变为1; 2. ~ :表示按位取反,即在数值的二进制表示方式上,将0变为1,将1变为0; 3. 上述其实可以从java中进行借鉴理解,java中!代表逻辑取反,针对的是boolean型变量计算;而~代表数值取反,针对整型变量进行计算;通过如下例子来验证上述结论:reverse_not.c
C语言 八进制 16进制 原码 反码 补码 按位取反
C语言中8进制和16进制怎么表示 C语言本身支持的三种输入是: 1. 十进制。比如20,457;  2. 十六进制,以0x开头。比如0x7a;  3. 八进制,以0开头。比如05,0237 所以C语言没有二进制输入,最多可用函数去实现。 八进制数的表达方法 C/C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0(数字0),如:123是十进制,
C语言位运算符及作用:与、或、异或、取反、左移和右移
一、& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 应用: (1)清零 若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件: 原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。 a 00101011 b 10010100 c 00000000 //c = a & b (2)取一个数中某些指
C语言的取反操作(15)
C语言的取反操作由于取两次复原。所以经常用于加密系统:/**//************************************************************ Copyright (C), 1998-2006, Rx. Co., Ltd. FileName: example.cpp Author: longronglin Version : 1.0 Date: 2
java中按位取反 ~5=-6
java中按位取反 ~5=-6。原因:这是因为整数在计算机中是二进制存储的。java中 ~5=-6 ,而这个-6是输出到屏幕上,我们看到的是-6。首先看对5求反,5的二进制原码是:0000 0101,取反之后是:1111 1010 ,得到的这个值在计算机中的存储原型也是 1111 1010,而要把这个结果显示出来,到计算机屏幕上就要转换成十进制,也就是说 1111 1010 是补码形式,补码 = ...
C语言位操作中指定的某一位数置0、置1、取反
C语言位操作中指定的某一位数置0、置1、取反 一、指定的某一位数置1                 宏 #define setbit(x,y)  x|=(1 二、指定的某一位数置0             宏  #define clrbit(x,y)  x&=~(1 三、指定的某一位数取反                宏  #define reversebit(