首页 > 其他分享 >位操作技巧:正数不取反,负数取反

位操作技巧:正数不取反,负数取反

时间:2022-11-19 22:47:56浏览次数:53  
标签:位操作 Console int 取反 value 异或 WriteLine 正数

原理

1) 异或运算法则:异或的两个bit相同结果为1,不同结果为0
2) 一个数^0还是自身, 没有任何效果,因为0^0=0, 1^0=1。
例子:0b0101,1010 ^ 0b0000,0000=0b0101,1010
3) 单个bit^1是取反的效果,0^1=1, 1^1=0,所以一个int变量^0xffffffff就是整个int取反的效果

 

代码

1) 思路:当符号位为0时,异或0,为1时,异或0xffffffff

2) 不用判断语句实现:正数不取反,负数取反

static void Test(int value)
{
    Console.WriteLine($"{Convert.ToString(value, 2).PadLeft(32, '0')}, 补码");

    uint temp = (uint)value;
    uint signBit = temp >> 31; //强转为无符号数, 是为了右移左侧总是补0

    //如果为正数, signBit为0, 变负没有效果, 相当于 value ^ 0
    //如果为负数, signBit为1, 再变负, 相当于 value ^ -1, 即: value ^ 0xffffffff, 即为取反
    int reverseMask = -(int)signBit;
    int result = value ^ reverseMask;

    Console.WriteLine($"{Convert.ToString(reverseMask, 2).PadLeft(32, '0')}, reverseMask");
    Console.WriteLine($"{Convert.ToString(result, 2).PadLeft(32, '0')}");

    Console.WriteLine();
}

运行后:

static void Main(string[] args)
{
    Test(1);
    Test(-1);
}

运行结果:


2) 上面的代码可以简化为1行

int result2 = value ^ -(int)((uint)value >> 31);

 

标签:位操作,Console,int,取反,value,异或,WriteLine,正数
From: https://www.cnblogs.com/sailJs/p/16906057.html

相关文章

  • 位操作对符号位的影响
    先上结论右移:1)有符号数:左侧会使用符号位补齐2)无符号数:左侧补0左移:符号位也会被左移,右侧补0取反:符号位也会被取反测试代码//有符号数staticvoidPrint(inta){......
  • 缺失的第一个正数
    题目给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。示例1:输入:nums=[1,2......
  • 移位操作 优先级 低于+ -优先级
    <<1效率没*2效率高参考链接https://blog.popkx.com/c语言程序中-移位操作代替乘除操作-效率更高吗/解析C语言程序中,使用移位操作代替乘除操作更快吗?现在这个问题我......
  • 代码随想录day34 | 1005.K次取反后最大化的数组和 134.加油站 135. 分发糖果
    1005.K次取反后最大化的数组和题目|文章思路如何让翻转后的数组和最大,就是尽可能的反转绝对值大的负数。当反转次数多余时,不断反转绝对值最小的数。首先将整个数组按......
  • python 中 if语句取反
     001、>>>str1=">aabbcc">>>ifstr1.startswith(">"):...print("yes")...yes>>>ifnotstr1.startswith(">"):##python中if语句取反...prin......
  • 1005.maximize-sum-of-array-after-k-negations K次取反后最大化数组和
    问题描述1005.K次取反后最大化的数组和解题思路贪心算法代码classSolution{staticboolcmp(inta,intb){returnabs(a)>abs(b);}public:intlar......
  • 取反运算符
    必备知识:1.不会二进制和十进制转换的同学点击这里学习https://jingyan.baidu.com/article/597a0643614568312b5243c0.html2.二进制中第一位为符号位,0代表正数,1代表负......
  • 2. 奇偶正负交错运算 (取反算法)
    2.奇偶正负交错运算2.1算法/**description:1~100正负交错加减(1-2+3-4+5...+99-100)*/publicclassInverseSum{publicstaticvoidmain(String[]arg......
  • #yyds干货盘点# 动态规划专题:乘积为正数的最长连续子数组
    1.简述:描述给定一个长度为n的整数数组,请你找出其中最长的乘积为正数的子数组长度。子数组的定义是原数组中一定长度的连续数字组成的数组。数据范围:  ,数组中的元素满......
  • sql语法巧用之not取反
    数据库的重要性和通用性都不用说了,什么sql的通用性,sql优化之类的也不必说了,咱们今天来聊聊另一个有意思的话题:如何取一个筛选的反面案例。 1.举几个正反案例的例子......