标签: bit-shift

c/c ++ left shift unsigned vs signed

我有这个代码.

#include <iostream>

int main()
{
    unsigned long int i = 1U << 31;
    std::cout << i << std::endl;
    unsigned long int uwantsum = 1 << 31;
    std::cout << uwantsum << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印出来.

2147483648
18446744071562067968
Run Code Online (Sandbox Code Playgroud)

在Arch Linux 64位,gcc,常春藤桥架构上.

第一个结果是有道理的,但我不明白第二个数字的来源.1表示为4byte int signed或unsigned is

00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)

当你向左移动31次时,你最终得到了

10000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

没有?我知道向左移动正数基本上是2 ^ k,其中k是你移动它的次数,假设它仍然适合于界限.为什么我得到这么奇怪的数字?

c++ bit-shift

10
推荐指数
2
解决办法
1万
查看次数

在c#中将两个uint组合成ulong的最佳方法是什么?

在c#中将两个uint组合成ulong的最佳方法是什么,设置高/低uints.

我知道bitshifting可以做到这一点,但我不知道语法,或者可能有其他API来帮助像BitConverter,但我没有看到一个方法做我想要的.

c# bit-shift ulong uint

9
推荐指数
1
解决办法
3106
查看次数

除了快速数学之外,有没有什么好理由使用位移?

我理解按位操作以及它们如何用于不同目的,例如权限.但是,我似乎不明白比特移位运算符的用途.我理解他们是如何工作的,但我想不出任何我可能想要使用它们的场景,除非我想做一些非常快速的乘法或除法.有没有其他理由使用位移?

bit-manipulation bit-shift

9
推荐指数
3
解决办法
4645
查看次数

Java位操作 - (num >> = 1)做什么?

我正在查看一些代码,这些代码输出一个带有前置0的二进制形式的数字.

    byte number = 48;
    int i = 256; //max number * 2
    while( (i >>= 1) > 0) {
        System.out.print(((number & i) != 0 ? "1" : "0"));
    }
Run Code Online (Sandbox Code Playgroud)

并且不明白它的i >>= 1作用.我知道i >> 1向右移动1位但不明白它的=作用,据我所知,不可能搜索">> ="来找出它意味着什么.

java bit-manipulation bit-shift

9
推荐指数
1
解决办法
7070
查看次数

找到一个数字是否可被8整除 - 使用位移算子

我最近在一次采访中被问到,只使用位移操作符,编写一些代码,告诉你一个数字是否可被8整除,显然代码很短 - 有没有人有线索?

bit-shift bitwise-operators

9
推荐指数
2
解决办法
2万
查看次数

添加两个数字而不是除以2时,如何使用>>> 1防止溢出?

我已经在一些地方看到以下代码建议添加到数字并除以2,特别是在查找数组中间索引以进行快速排序的上下文中.

int middle = ( low + high ) >>> 1;

反对 int middle = ( low + high ) / 2;

如果我在基础知识上错了,请纠正我.右移位1位(>> 1)具有除以2的效果.因为在java int中,我们不想改变第一位,所以我们使用无符号移位运算符>>>.我听说这可以防止整数溢出,但我不知道如何.根据docs算术运算符主导轮班.这是一个有争议的问题,因为无论如何都要使用括号.如果( )溢出中的任何东西为什么外面的东西很重要?

java bit-shift quicksort

9
推荐指数
1
解决办法
238
查看次数

请解释逻辑右移,右移右移和向右旋转之间的区别

我一直在阅读经典黑客的喜悦,我无法理解逻辑右移,算术右移和右旋之间的区别.如果怀疑看起来太简单,请原谅.

还有为什么没有算术转移呢?

bit-manipulation bit-shift bit bitwise-operators

9
推荐指数
3
解决办法
8805
查看次数

Perl与Java的>>和>>>运算符相当于6?

我已经使用Perl 6开始,我目前从我的Java项目移植了一些代码,他们使用Java的移位操作符<<>>,还有>>>运营商.

目前我正在使用+> \ +<(和~>)运营商来弥补这一点,但它们是否相同?

bit-shift perl6

9
推荐指数
1
解决办法
200
查看次数

如何在Python中对有符号和无符号值进行算术右移

某些语言(例如 Java、Verilog)同时具有按位逻辑运算符(<<、>>)和算术移位运算符(<<<、>>>)。

对于无符号值,逻辑移位和算术移位具有相同的操作。假设 8'b11000101 是 8 位无符号数 197 的二进制表示,那么

8'b11000101 >>  2 => 8'b00110001
8'b11000101 >>> 2 => 8'b00110001
8'b11000101 <<  2 => 8'b00010100
8'b11000101 <<< 2 => 8'b00010100
Run Code Online (Sandbox Code Playgroud)

对于有符号值,只有算术和逻辑左移操作是相同的,但算术右移会导致符号扩展。假设 8'b11000101 是 8 位有符号数 -59 的二进制表示,那么

8'b11000101 >>  2 => 8'b00110001
8'b11000101 >>> 2 => 8'b11110001
8'b11000101 <<  2 => 8'b00010100
8'b11000101 <<< 2 => 8'b00010100
Run Code Online (Sandbox Code Playgroud)

Python只有逻辑移位运算符,没有算术移位运算符。那么如何在Python中实现有符号和无符号值的算术右移呢?

python math bit-shift shift bitwise-operators

9
推荐指数
2
解决办法
1万
查看次数

左移中整数文字后缀的用途

在 C 语言中,许多运算都采用位移位,其中经常使用整数文字。例如,考虑以下代码片段:

#define test_bit(n, flag) (1UL << (n) & (flag))
Run Code Online (Sandbox Code Playgroud)

据我所知,整数文字后缀UL应该抑制移位中不需要的行为,例如对有符号整数进行符号扩展可能会导致设置多个位。但是,如果情况只是进行左移,如上所示,我们还需要整数文字后缀吗?

由于左移不会导致意外行为,因此我无法弄清楚其目的是什么。像上面这样的代码经常出现在Linux内核等项目中,这让我觉得一定是有需要的。UL有谁知道这种情况下后缀的用途吗?

c bit-manipulation bit-shift

9
推荐指数
3
解决办法
546
查看次数

标签 统计

bit-shift ×10

bit-manipulation ×4

bitwise-operators ×3

java ×2

bit ×1

c ×1

c# ×1

c++ ×1

math ×1

perl6 ×1

python ×1

quicksort ×1

shift ×1

uint ×1

ulong ×1