Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
11 / 11 / 7
Регистрация: 18.01.2014
Сообщений: 180
Записей в блоге: 1

Преобразование двоичного числа в знаковое целое

09.03.2017, 15:28. Показов 3965. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Столкнулся с такой ситуацией:
PHP
1
echo decbin(-1313046528);
возвращает:
1111111111111111111111111111111110110001 101111001000000000000000
Если это же число сунуть в bindec вот так:
PHP
1
echo bindec(1111111111111111111111111111111110110001101111001000000000000000);
то возвращает не исходное число а билибирду....
1.8446744063807E+19
Как получить исходную число?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.03.2017, 15:28
Ответы с готовыми решениями:

Преобразование двоичного числа в строку
2. Напишите программу, которая осуществляет преобразование двоичного числа в строку.

Преобразование двоичного числа в десятичное
var s: string; i,j:integer; k,sum:real; begin writeln('Введите восьмиразрядовое двоичное число'); writeln('И нажмите...

Преобразование восьмиразрядного двоичного числа в десятичное
Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное двоичное число в десятичное. Помогите пожалуйста :)

16
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.03.2017, 15:33
Передавать двоичное представление в функцию bindec как строку, а не число.
0
11 / 11 / 7
Регистрация: 18.01.2014
Сообщений: 180
Записей в блоге: 1
09.03.2017, 15:51  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Передавать двоичное представление в функцию bindec как строку, а не число.
PHP
1
2
echo decbin(-1313046528)."<br>";
echo bindec((string)1111111111111111111111111111111110110001101111001000000000000000)."<br>";
Возвращает:
1111111111111111111111111111111110110001 101111001000000000000000
16383
Или я что то не так делаю?

При этом внутри моей функции bindec ведет себя уже по другому, код что выше вне функции находится
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.03.2017, 16:00
Просто возьми это длиное число в кавычки
0
11 / 11 / 7
Регистрация: 18.01.2014
Сообщений: 180
Записей в блоге: 1
09.03.2017, 16:03  [ТС]
PHP
1
echo bindec("1111111111111111111111111111111110110001101111001000000000000000");
Вернуло:
1.8446744072397E+19
Сайты которые занимаются переводом чисел двоичных тоже самое возвращают
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.03.2017, 16:03
http://php.net/manual/ru/function.bindec.php тут сказано что bindec не интерпретирует старший бит как знаковый, так что bindec тут не подойдет.
0
11 / 11 / 7
Регистрация: 18.01.2014
Сообщений: 180
Записей в блоге: 1
09.03.2017, 16:54  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
http://php.net/manual/ru/function.bindec.php тут сказано что bindec не интерпретирует старший бит как знаковый, так что bindec тут не подойдет.
Как то вручную обработать этот самый старший бит возможно чтобы в итоге получить с помощью bindec положительное число?
Сверху положительное число, снизу отрицательное (на нижнее подчеркивание не обращайте внимания, это для удобства):
_________________________________1001110 010000111000000000000000
1111111111111111111111111111111110110001 101111001000000000000000
Тут я лишь парочку закономерностей вижу:
Все еденицы с начала удаляются у отрицательного числа и до последней еденицы идет замена цифр
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.03.2017, 17:09
Лучший ответ Сообщение было отмечено vip72 как решение

Решение

Чтобы по двоичному представлению отрицательного числа получить соответствующее ему положительное нужно инвертировать все разряды и прибавить 1 - так называемый дополнительный код.
1
11 / 11 / 7
Регистрация: 18.01.2014
Сообщений: 180
Записей в блоге: 1
09.03.2017, 17:15  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Чтобы по двоичному представлению отрицательного числа получить соответствующее ему положительное нужно инвертировать все разряды и прибавить 1 - так называемый дополнительный код.
То есть логика такая:
судя по всему разряды это числа до последней единицы
1111111111111111111111111111111110110001 101111001000000000000000
тогда получается что то типо этого если инвертировать
0000000000000000000000000000000001001110 010000110000000000000000
и в конец разряда суем единицу:
0000000000000000000000000000000001001110 010000111000000000000000
Далее нули с самого начала все удаляются ибо нету толка, профит?
1001110010000111000000000000000
Верно не?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.03.2017, 17:21
Инвертируются абсолютно все 1 и 0 в исходном числе, не надо останавливаться на последней единице.
0
11 / 11 / 7
Регистрация: 18.01.2014
Сообщений: 180
Записей в блоге: 1
10.03.2017, 01:12  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Инвертируются абсолютно все 1 и 0 в исходном числе, не надо останавливаться на последней единице.
Тогда после инвертирования:
0000000000000000000000000000000001001110 010000110111111111111111
После прибавления единицы:
0000000000000000000000000000000001001110 010000111000000000000000
Ну да... логично)) спасибо вам)

Добавлено через 7 часов 26 минут
В общем народ... написал мини функцию для преобразования 64 битного числа integer в 32 битное
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function bit64to32($num) {
        $decoded=decbin($num);
        $decoded=bindec("$decoded");
        while($decoded>2147483647) {
            $decoded=~$decoded;
            $decoded=decbin($decoded);
            $toDelete = 32;
            mb_internal_encoding("UTF-8");
            $decoded = plus1(mb_substr($decoded, $toDelete));
            $decoded=bindec("$decoded");
        }
        return $decoded;
    }
    
    function plus1($string) {
        $dlina=strlen($string)-1;
        $char_array = str_split($string);
        $kek=true;
        while($kek) {
            if ($char_array[$dlina]=="1") {
                $char_array[$dlina]="0";
                $dlina=$dlina-1;
                continue;
            }
            if ($char_array[$dlina]=="0") {
                $char_array[$dlina]="1";
                $kek=false;
            }
        }
        return implode($char_array);
    }
Использовать так:
PHP
1
2
echo bit64to32(3000000000);
//выведет 12949672969
Минус в том что по идее вроде как возвращает положительное число только
Если в 32 битной системе в integer засунуть число 3 миллиарда... то в нем будет число -1294967296
Он выведет его в положительном виде: 12949672969
Можно переделать чтобы и с отрицательными числами работал...
Я во всяком случае проверил... совпадает все... слушаю ваши унижения и комментарии

Добавлено через 21 минуту
В общем щас понял что косяк есть (в первых двух строчках внутри функции):
PHP
1
2
$decoded=decbin($num);
$decoded=bindec("$decoded");
Достаточно заменить на
PHP
1
$decoded=$num;
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
10.03.2017, 20:50
Цитата Сообщение от vip72 Посмотреть сообщение
PHP
1
mb_internal_encoding("UTF-8");
Цитата Сообщение от vip72 Посмотреть сообщение
PHP
1
mb_substr($decoded, $toDelete)
А зачем функции для работы с многобайтовыми символами использовать для однобайтных символов цифр?
Если я правильно понял ход ваших мыслей, то ваши функции можно заменить на
PHP
1
echo abs(unpack('l', pack('l', 3000000000))[1]);
Добавлено через 24 минуты
PHP
1
2
3
function signed_bindec($bin) {
    return unpack('l', pack('l', bindec($bin)))[1];
}
1
11 / 11 / 7
Регистрация: 18.01.2014
Сообщений: 180
Записей в блоге: 1
11.03.2017, 00:07  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
можно заменить
Настолько мощного ответа я просто не ожидал, десятичасовое мучение заменилось одной строчкой...
Чувства зашкаливают, кое что горит ярким пламенем а в душе радость
Мда... надо было все же пройтись по функциям которые с двоичной системой работают....
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
11.03.2017, 00:28
Kerry_Jr,
PHP
1
2
3
4
5
6
function signed_bindec($bin) {
    return unpack('l', pack('l', bindec($bin)))[1];
}
 
$bin = decbin(-2);
var_dump($bin, signed_bindec($bin)); // получаю 0 вместо -2.
1
11 / 11 / 7
Регистрация: 18.01.2014
Сообщений: 180
Записей в блоге: 1
11.03.2017, 02:09  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
bindec
Насколько я понимаю bindec как было сказано выше жует только чисто положительные числа, на отрицательные у него аллергия и придется судя по всему вручную обрабатывать отрицательное число инверсией + 1 бит да? блеснул однозначно своими знаниями
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
11.03.2017, 10:59
Jewbacabra, хмм, а на "больших" отрицательных работает. Ладно, моя попытка №5
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
function signed_bindec($bin) {
    if (strlen($bin) == 64 && $bin{0} == '1'){
        $temp = array_map(function($i){
                return $i == '1' ? '0' : '1';
            },
            str_split($bin)
        );
        $temp = -bindec(implode($temp)) - 1;
    } else {
        $temp = bindec($bin);
    }
    return $temp;
}
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
11.03.2017, 13:18
Лучший ответ Сообщение было отмечено Kerry_Jr как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function signed_bindec($bin) {
    if ($bin{0} === '0') {
        return bindec($bin);
    }
    $size = strlen($bin) - 1;
    $result = 0;
    for ($i = 0; $i <= $size; ++$i) {
        $result |= $bin{$size - $i} << $i;
    }
    return $result;
}
 
var_dump(
    signed_bindec(decbin(-1)),
    signed_bindec(decbin(-2)),
    signed_bindec(decbin(-10)),
    signed_bindec(decbin(-100500)),
    signed_bindec(decbin(-2000000))
);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2017, 13:18
Помогаю со студенческими работами здесь

Преобразование двоичного числа в символьном виде
Нужна помощь в программе: есть строка на входе, введенная с клавиатуры, содержащая в себе двоичное число, эту строку нужно преобразовать в...

Преобразование сверхбольшого двоичного числа в строку-десятичное_число.
Пишу класс для хранение и операций над числами большой размерности. Перепробовал несколько вариантов представления числа и на данный...

вывести 1 байтовое целое знаковое число в 2-ом коде
вывести 1 байтовое целое знаковое число в 2-ом коде с использованием двоичной маски-без деления.

Преобразование двоичного числа в десятичное. В микроконтроллере AVR Atmega8
Здравствуйте. Написал функцию для перевода пришедшего двоичного числа в десятичное и вывода его на LCD дисплей. Но функция не хочет...

Преобразование введенного с клавиатуры восьмиразрядного двоичного числа в десятичное
Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное двоичное число в десятичное. Рекомендуемый вид экрана во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru